From nobody@FreeBSD.org  Thu Jun 11 08:48:02 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 5DA71106566B
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 11 Jun 2009 08:48:01 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 4ACA88FC15
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 11 Jun 2009 08:48:01 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id n5B8m0tN016020
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 11 Jun 2009 08:48:00 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id n5B8m0V1016019;
	Thu, 11 Jun 2009 08:48:00 GMT
	(envelope-from nobody)
Message-Id: <200906110848.n5B8m0V1016019@www.freebsd.org>
Date: Thu, 11 Jun 2009 08:48:00 GMT
From: Petr Salinger <Petr.Salinger@seznam.cz>
To: freebsd-gnats-submit@FreeBSD.org
Subject: broken detection of Linux binaries via ".note.ABI-tag" section.
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         135468
>Category:       kern
>Synopsis:       broken detection of Linux binaries via ".note.ABI-tag" section.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    bz
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jun 11 08:50:01 UTC 2009
>Closed-Date:    Thu Aug 27 22:36:05 UTC 2009
>Last-Modified:  Thu Aug 27 22:36:05 UTC 2009
>Originator:     Petr Salinger
>Release:        
>Organization:
>Environment:
>Description:
The current (7.2, 8.0) code tries to detect Linux binaries by parsing".note.ABI-tag" section.

The layout of this note is different compared to layout of native FreeBSD one.


From http://www.netbsd.org/docs/kernel/elf-notes.html:

Starting with glibc 2.1, the GNU project will be using a single ELF Note to indicate which GNU operating system and which version of that system a binary was built for. The format of that note is:

Name Size
    4
Desc Size
    16
Type
    4-byte integer containing the value 0x01 
Name
    "GNU\0"
Desc
    Four 4-byte integers containing, in order:

       1. OS (0 = Linux, 1 = Hurd, 2 = Solaris)
       2. Major
       3. Minor
       4. Teeny


So linux emulation should be used only when Name is "GNU"  AND first 4-byte integer in Desc is zero. The current code breaks libc environment compiled with native FreeBSD calling convention - Desc = 3.

>How-To-Repeat:

>Fix:
Correct solution would be to provide a "brand checker" function which would return:
1 for unknown brand,
osreldate for know brand with OSREL capability,
0 for know brand without  OSREL capability.

Alternatively is possible to use fact, that in current both cases exactly 8 bytes have to be checked, see attached patch.


Patch attached with submission follows:

Upstream checks the .note.ABI-tag in a bad way.
They should not only check the "GNU", but also whether OS field matches.
In both cases they should check 8 bytes, we can use it for current hack.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532627



Index: src/sys/amd64/linux32/linux32_sysvec.c
===================================================================
--- src.orig/sys/amd64/linux32/linux32_sysvec.c
+++ src/sys/amd64/linux32/linux32_sysvec.c
@@ -1047,10 +1047,10 @@
 	.sv_maxssiz	= &linux32_maxssiz,
 };
 
-static char GNULINUX_ABI_VENDOR[] = "GNU";
+static char GNULINUX_ABI_VENDOR[] = "GNU\0\0\0\0\0";
 
 static Elf_Brandnote linux32_brandnote = {
-	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
+	.hdr.n_namesz	= 4,
 	.hdr.n_descsz	= 16,
 	.hdr.n_type	= 1,
 	.vendor		= GNULINUX_ABI_VENDOR,
Index: src/sys/i386/linux/linux_sysvec.c
===================================================================
--- src.orig/sys/i386/linux/linux_sysvec.c
+++ src/sys/i386/linux/linux_sysvec.c
@@ -1017,10 +1017,10 @@
 	.sv_maxssiz	= NULL
 };
 
-static char GNULINUX_ABI_VENDOR[] = "GNU";
+static char GNULINUX_ABI_VENDOR[] = "GNU\0\0\0\0\0";
 
 static Elf_Brandnote linux_brandnote = {
-	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
+	.hdr.n_namesz	= 4,
 	.hdr.n_descsz	= 16,
 	.hdr.n_type	= 1,
 	.vendor		= GNULINUX_ABI_VENDOR,
Index: src/sys/kern/imgact_elf.c
===================================================================
--- src.orig/sys/kern/imgact_elf.c
+++ src/sys/kern/imgact_elf.c
@@ -112,10 +112,10 @@
 #define	round_page_ps(va, ps)	(((va) + (ps - 1)) & ~(ps - 1))
 #define	aligned(a, t)	(trunc_page_ps((u_long)(a), sizeof(t)) == (u_long)(a))
 
-static const char FREEBSD_ABI_VENDOR[] = "FreeBSD";
+static const char FREEBSD_ABI_VENDOR[] = "FreeBSD\0";
 
 Elf_Brandnote __elfN(freebsd_brandnote) = {
-	.hdr.n_namesz	= sizeof(FREEBSD_ABI_VENDOR),
+	.hdr.n_namesz	= 8,
 	.hdr.n_descsz	= sizeof(int32_t),
 	.hdr.n_type	= 1,
 	.vendor		= FREEBSD_ABI_VENDOR,
@@ -1393,8 +1393,7 @@
 		    note->n_type != checknote->hdr.n_type)
 			goto nextnote;
 		note_name = (const char *)(note + 1);
-		if (strncmp(checknote->vendor, note_name,
-		    checknote->hdr.n_namesz) != 0)
+		if (memcmp(checknote->vendor, note_name, 8) != 0)
 			goto nextnote;
 
 		/*


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->dchagin 
Responsible-Changed-By: dchagin 
Responsible-Changed-When: Fri Jun 19 18:09:23 UTC 2009 
Responsible-Changed-Why:  
Grab. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=135468 

From: Chagin Dmitry <dchagin@freebsd.org>
To: Petr Salinger <Petr.Salinger@seznam.cz>
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/135468: broken detection of Linux binaries via
	".note.ABI-tag" section.
Date: Fri, 19 Jun 2009 22:09:09 +0400

 --45Z9DzgjV8m4Oswq
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 On Thu, Jun 11, 2009 at 08:48:00AM +0000, Petr Salinger wrote:
 >=20
 > >Number:         135468
 > >Category:       kern
 > >Synopsis:       broken detection of Linux binaries via ".note.ABI-tag" s=
 ection.
 > >Confidential:   no
 > >Severity:       non-critical
 > >Priority:       low
 > >Responsible:    freebsd-bugs
 > >State:          open
 > >Quarter:       =20
 > >Keywords:      =20
 > >Date-Required:
 > >Class:          sw-bug
 > >Submitter-Id:   current-users
 > >Arrival-Date:   Thu Jun 11 08:50:01 UTC 2009
 > >Closed-Date:
 > >Last-Modified:
 > >Originator:     Petr Salinger
 > >Release:       =20
 > >Organization:
 > >Environment:
 > >Description:
 > The current (7.2, 8.0) code tries to detect Linux binaries by parsing".no=
 te.ABI-tag" section.
 >=20
 > The layout of this note is different compared to layout of native FreeBSD=
  one.
 >=20
 >=20
 > >From http://www.netbsd.org/docs/kernel/elf-notes.html:
 >=20
 > Starting with glibc 2.1, the GNU project will be using a single ELF Note =
 to indicate which GNU operating system and which version of that system a b=
 inary was built for. The format of that note is:
 >=20
 > Name Size
 >     4
 > Desc Size
 >     16
 > Type
 >     4-byte integer containing the value 0x01=20
 > Name
 >     "GNU\0"
 > Desc
 >     Four 4-byte integers containing, in order:
 >=20
 >        1. OS (0 =3D Linux, 1 =3D Hurd, 2 =3D Solaris)
 >        2. Major
 >        3. Minor
 >        4. Teeny
 >=20
 >=20
 > So linux emulation should be used only when Name is "GNU"  AND first 4-by=
 te integer in Desc is zero. The current code breaks libc environment compil=
 ed with native FreeBSD calling convention - Desc =3D 3.
 >=20
 > >How-To-Repeat:
 >=20
 > >Fix:
 > Correct solution would be to provide a "brand checker" function which wou=
 ld return:
 > 1 for unknown brand,
 > osreldate for know brand with OSREL capability,
 > 0 for know brand without  OSREL capability.
 >=20
 > Alternatively is possible to use fact, that in current both cases exactly=
  8 bytes have to be checked, see attached patch.
 >=20
 >=20
 > Patch attached with submission follows:
 >=20
 > Upstream checks the .note.ABI-tag in a bad way.
 > They should not only check the "GNU", but also whether OS field matches.
 > In both cases they should check 8 bytes, we can use it for current hack.
 >=20
 > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D532627
 >=20
 
 please, try http://people.freebsd.org/~dchagin/patches/abi-tag.patch
 
 
 --=20
 Have fun!
 chd
 
 --45Z9DzgjV8m4Oswq
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.10 (FreeBSD)
 
 iEYEARECAAYFAko71EUACgkQ0t2Tb3OO/O3VzgCguj0hb0OEeNVQO3VWvG5SrNOr
 QcoAn1WyIXpPM433kxbvP+54I74JNXtD
 =9uwq
 -----END PGP SIGNATURE-----
 
 --45Z9DzgjV8m4Oswq--

From: Petr Salinger <Petr.Salinger@seznam.cz>
To: Chagin Dmitry <dchagin@freebsd.org>
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Mon, 22 Jun 2009 20:43:22 +0200 (CEST)

 >> Upstream checks the .note.ABI-tag in a bad way.
 >> They should not only check the "GNU", but also whether OS field matches.
 >> In both cases they should check 8 bytes, we can use it for current hack.
 >>
 >> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532627
 
 > please, try http://people.freebsd.org/~dchagin/patches/abi-tag.patch
 
 I tested it, unfortunately, it does not work.
 At least check in linux_trans_osrel() is bad.
 The "note + 1 + roundup2(note->n_namesz, sizeof(Elf32_Addr)" may point 
 even outside the note.
 
 Please also change at least
 
    static char GNULINUX_ABI_VENDOR[] = "GNU";
 into
    static char GNU_ABI_VENDOR[] = "GNU";
 
 as there is really GNU/kFreeBSD.
 
 It would be nice to allow multiple ELF OSABI-notes for a given brand.
 
 Petr
 

From: "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>
To: bug-followup@FreeBSD.org, Petr.Salinger@seznam.cz
Cc:  
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Mon, 10 Aug 2009 07:37:19 +0000 (UTC)

 Hi,
 
 are there any other news not mentioned here? A final patch to try, ..?
 
 /bz
 
 -- 
 Bjoern A. Zeeb                      The greatest risk is not taking one.

From: Petr Salinger <Petr.Salinger@seznam.cz>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Thu, 13 Aug 2009 10:15:44 +0200 (CEST)

   This message is in MIME format.  The first part should be readable text,
   while the remaining parts are likely unreadable without MIME-aware tools.
 
 --546530387-922302153-1249990938=:18053
 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; FORMAT=flowed
 Content-ID: <Pine.LNX.4.62.0908131014591.22774@sci.felk.cvut.cz>
 
 Hi.
 
 > do you have any newer version of the patch, that is not in the PR?
 > 
 > I talked to dchagin's mentor and he said dchagin seems to be AWOL.
 > I'd like to get this fixed before FreeBSD 8.0 release so if theres is
 > anything you have for me I can continue to handle this.
 
 Attached as abi-tag.001.patch is last version of patch from Chagin Dmitry,
 my comments for it have been:
 
 >> In the patch from previous mail, linux_trans_osrel() have been fixed,
 >> but IMHO the freebsd_trans_osrel() still need change.
 >> Otherwise it will return wrong osrel.
 
 >> The freebsd_trans_osrel() should be like
 >> *osrel = *(const int32_t *)(
 >>        (const char *) (note + 1) +
 >>        roundup2(note->n_namesz, sizeof(Elf32_Addr)));
 
 Petr
 --546530387-922302153-1249990938=:18053
 Content-Type: TEXT/X-DIFF; CHARSET=US-ASCII; NAME=abi-tag.001.patch
 Content-Transfer-Encoding: BASE64
 Content-ID: <Pine.LNX.4.62.0908111342180.18053@sci.felk.cvut.cz>
 Content-Description: 
 Content-Disposition: ATTACHMENT; FILENAME=abi-tag.001.patch
 
 ZGlmZiAtLWdpdCBhL3N5cy9hbWQ2NC9saW51eDMyL2xpbnV4MzJfc3lzdmVj
 LmMgYi9zeXMvYW1kNjQvbGludXgzMi9saW51eDMyX3N5c3ZlYy5jDQppbmRl
 eCAyNTc1YTM2Li44MDk2NmViIDEwMDY0NA0KLS0tIGEvc3lzL2FtZDY0L2xp
 bnV4MzIvbGludXgzMl9zeXN2ZWMuYw0KKysrIGIvc3lzL2FtZDY0L2xpbnV4
 MzIvbGludXgzMl9zeXN2ZWMuYw0KQEAgLTEyNyw2ICsxMjcsNyBAQCBzdGF0
 aWMgdm9pZCAgICAgbGludXhfc2VuZHNpZyhzaWdfdCBjYXRjaGVyLCBrc2ln
 aW5mb190ICprc2ksIHNpZ3NldF90ICptYXNrKTsNCiBzdGF0aWMgdm9pZAll
 eGVjX2xpbnV4X3NldHJlZ3Moc3RydWN0IHRocmVhZCAqdGQsIHVfbG9uZyBl
 bnRyeSwNCiAJCQkJICAgdV9sb25nIHN0YWNrLCB1X2xvbmcgcHNfc3RyaW5n
 cyk7DQogc3RhdGljIHZvaWQJbGludXgzMl9maXhsaW1pdChzdHJ1Y3Qgcmxp
 bWl0ICpybCwgaW50IHdoaWNoKTsNCitzdGF0aWMgYm9vbGVhbl90IGxpbnV4
 MzJfdHJhbnNfb3NyZWwoY29uc3QgRWxmX05vdGUgKm5vdGUsIGludDMyX3Qg
 Km9zcmVsKTsNCiANCiBzdGF0aWMgZXZlbnRoYW5kbGVyX3RhZyBsaW51eF9l
 eGl0X3RhZzsNCiBzdGF0aWMgZXZlbnRoYW5kbGVyX3RhZyBsaW51eF9zY2hl
 ZHRhaWxfdGFnOw0KQEAgLTEwNjQsMTQgKzEwNjUsMzEgQEAgc3RydWN0IHN5
 c2VudHZlYyBlbGZfbGludXhfc3lzdmVjID0gew0KIAkuc3ZfcHJvY2dpZAk9
 IE5VTEwNCiB9Ow0KIA0KLXN0YXRpYyBjaGFyIEdOVUxJTlVYX0FCSV9WRU5E
 T1JbXSA9ICJHTlUiOw0KK3N0YXRpYyBjaGFyIEdOVV9BQklfVkVORE9SW10g
 PSAiR05VIjsNCitzdGF0aWMgaW50IEdOVUxJTlVYX0FCSV9ERVNDID0gMDsN
 CisNCitzdGF0aWMgYm9vbGVhbl90DQorbGludXgzMl90cmFuc19vc3JlbChj
 b25zdCBFbGZfTm90ZSAqbm90ZSwgaW50MzJfdCAqb3NyZWwpDQorew0KKwlj
 b25zdCBFbGYzMl9Xb3JkICp0YWc7DQorCXRhZyA9IChjb25zdCBFbGYzMl9X
 b3JkICopIG5vdGU7DQorCWlmICh0YWdbNF0gIT0gR05VTElOVVhfQUJJX0RF
 U0MpDQorCQlyZXR1cm4gKEZBTFNFKTsNCisNCisJKm9zcmVsID0gKHRhZ1s1
 XSAmIDB4ZmYpICogNjU1MzYgKw0KKwkgICAgKHRhZ1s2XSAmIDB4ZmYpICog
 MjU2ICsNCisJICAgICh0YWdbN10gJiAweGZmKTsNCisNCisJcmV0dXJuIChU
 UlVFKTsNCit9DQogDQogc3RhdGljIEVsZl9CcmFuZG5vdGUgbGludXgzMl9i
 cmFuZG5vdGUgPSB7DQotCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05VTElO
 VVhfQUJJX1ZFTkRPUiksDQorCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05V
 X0FCSV9WRU5ET1IpLA0KIAkuaGRyLm5fZGVzY3N6CT0gMTYsDQogCS5oZHIu
 bl90eXBlCT0gMSwNCi0JLnZlbmRvcgkJPSBHTlVMSU5VWF9BQklfVkVORE9S
 LA0KLQkuZmxhZ3MJCT0gMA0KKwkudmVuZG9yCQk9IEdOVV9BQklfVkVORE9S
 LA0KKwkuZmxhZ3MJCT0gQk5fVFJBTlNMQVRFX09TUkVMLA0KKwkudHJhbnNf
 b3NyZWwJPSBsaW51eDMyX3RyYW5zX29zcmVsDQogfTsNCiANCiBzdGF0aWMg
 RWxmMzJfQnJhbmRpbmZvIGxpbnV4X2JyYW5kID0gew0KZGlmZiAtLWdpdCBh
 L3N5cy9pMzg2L2xpbnV4L2xpbnV4X3N5c3ZlYy5jIGIvc3lzL2kzODYvbGlu
 dXgvbGludXhfc3lzdmVjLmMNCmluZGV4IDc5YjYwNGYuLjVhOWUwMzEgMTAw
 NjQ0DQotLS0gYS9zeXMvaTM4Ni9saW51eC9saW51eF9zeXN2ZWMuYw0KKysr
 IGIvc3lzL2kzODYvbGludXgvbGludXhfc3lzdmVjLmMNCkBAIC0xMDgsNiAr
 MTA4LDggQEAgc3RhdGljIHZvaWQgICAgIGxpbnV4X3NlbmRzaWcoc2lnX3Qg
 Y2F0Y2hlciwga3NpZ2luZm9fdCAqa3NpLCBzaWdzZXRfdCAqbWFzayk7DQog
 c3RhdGljIHZvaWQJZXhlY19saW51eF9zZXRyZWdzKHN0cnVjdCB0aHJlYWQg
 KnRkLCB1X2xvbmcgZW50cnksDQogCQkJCSAgIHVfbG9uZyBzdGFjaywgdV9s
 b25nIHBzX3N0cmluZ3MpOw0KIHN0YXRpYyByZWdpc3Rlcl90ICpsaW51eF9j
 b3B5b3V0X3N0cmluZ3Moc3RydWN0IGltYWdlX3BhcmFtcyAqaW1ncCk7DQor
 c3RhdGljIGJvb2xlYW5fdCBsaW51eF90cmFuc19vc3JlbChjb25zdCBFbGZf
 Tm90ZSAqbm90ZSwgaW50MzJfdCAqb3NyZWwpOw0KKw0KIA0KIHN0YXRpYyBp
 bnQgbGludXhfc3pwbGF0Zm9ybTsNCiBjb25zdCBjaGFyICpsaW51eF9wbGF0
 Zm9ybTsNCkBAIC0xMDMyLDE0ICsxMDM0LDMyIEBAIHN0cnVjdCBzeXNlbnR2
 ZWMgZWxmX2xpbnV4X3N5c3ZlYyA9IHsNCiAJLnN2X3Byb2NnaWQJPSBOVUxM
 DQogfTsNCiANCi1zdGF0aWMgY2hhciBHTlVMSU5VWF9BQklfVkVORE9SW10g
 PSAiR05VIjsNCitzdGF0aWMgY2hhciBHTlVfQUJJX1ZFTkRPUltdID0gIkdO
 VSI7DQorc3RhdGljIGludCBHTlVMSU5VWF9BQklfREVTQyA9IDA7DQorDQor
 c3RhdGljIGJvb2xlYW5fdA0KK2xpbnV4X3RyYW5zX29zcmVsKGNvbnN0IEVs
 Zl9Ob3RlICpub3RlLCBpbnQzMl90ICpvc3JlbCkNCit7DQorCWNvbnN0IEVs
 ZjMyX1dvcmQgKnRhZzsNCisNCisJdGFnID0gKGNvbnN0IEVsZjMyX1dvcmQg
 Kikgbm90ZTsNCisJaWYgKHRhZ1s0XSAhPSBHTlVMSU5VWF9BQklfREVTQykN
 CisJCXJldHVybiAoRkFMU0UpOw0KKw0KKwkqb3NyZWwgPSAodGFnWzVdICYg
 MHhmZikgKiA2NTUzNiArDQorCSAgICAodGFnWzZdICYgMHhmZikgKiAyNTYg
 Kw0KKwkgICAgKHRhZ1s3XSAmIDB4ZmYpOw0KKw0KKwlyZXR1cm4gKFRSVUUp
 Ow0KK30NCiANCiBzdGF0aWMgRWxmX0JyYW5kbm90ZSBsaW51eF9icmFuZG5v
 dGUgPSB7DQotCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05VTElOVVhfQUJJ
 X1ZFTkRPUiksDQorCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05VX0FCSV9W
 RU5ET1IpLA0KIAkuaGRyLm5fZGVzY3N6CT0gMTYsDQogCS5oZHIubl90eXBl
 CT0gMSwNCi0JLnZlbmRvcgkJPSBHTlVMSU5VWF9BQklfVkVORE9SLA0KLQku
 ZmxhZ3MJCT0gMA0KKwkudmVuZG9yCQk9IEdOVV9BQklfVkVORE9SLA0KKwku
 ZmxhZ3MJCT0gQk5fVFJBTlNMQVRFX09TUkVMLA0KKwkudHJhbnNfb3NyZWwJ
 PSBsaW51eF90cmFuc19vc3JlbA0KIH07DQogDQogc3RhdGljIEVsZjMyX0Jy
 YW5kaW5mbyBsaW51eF9icmFuZCA9IHsNCmRpZmYgLS1naXQgYS9zeXMva2Vy
 bi9pbWdhY3RfZWxmLmMgYi9zeXMva2Vybi9pbWdhY3RfZWxmLmMNCmluZGV4
 IGUyYzBhMTIuLjBlOGRkYTMgMTAwNjQ0DQotLS0gYS9zeXMva2Vybi9pbWdh
 Y3RfZWxmLmMNCisrKyBiL3N5cy9rZXJuL2ltZ2FjdF9lbGYuYw0KQEAgLTg4
 LDYgKzg4LDcgQEAgc3RhdGljIGludCBfX2VsZk4obG9hZF9zZWN0aW9uKShz
 dHJ1Y3Qgdm1zcGFjZSAqdm1zcGFjZSwgdm1fb2JqZWN0X3Qgb2JqZWN0LA0K
 IHN0YXRpYyBpbnQgX19DT05DQVQoZXhlY18sIF9fZWxmTihpbWdhY3QpKShz
 dHJ1Y3QgaW1hZ2VfcGFyYW1zICppbWdwKTsNCiBzdGF0aWMgYm9vbGVhbl90
 IF9fZWxmTihjaGVja19ub3RlKShzdHJ1Y3QgaW1hZ2VfcGFyYW1zICppbWdw
 LA0KICAgICBFbGZfQnJhbmRub3RlICpjaGVja25vdGUsIGludDMyX3QgKm9z
 cmVsKTsNCitzdGF0aWMgYm9vbGVhbl90IF9fZWxmTihmcmVlYnNkX3RyYW5z
 X29zcmVsKShjb25zdCBFbGZfTm90ZSAqbm90ZSwgaW50MzJfdCAqb3NyZWwp
 Ow0KIA0KIFNZU0NUTF9OT0RFKF9rZXJuLCBPSURfQVVUTywgX19DT05DQVQo
 ZWxmLCBfX0VMRl9XT1JEX1NJWkUpLCBDVExGTEFHX1JXLCAwLA0KICAgICAi
 Iik7DQpAQCAtMTExLDEyICsxMTIsMjIgQEAgc3RhdGljIEVsZl9CcmFuZGlu
 Zm8gKmVsZl9icmFuZF9saXN0W01BWF9CUkFORFNdOw0KIA0KIHN0YXRpYyBj
 b25zdCBjaGFyIEZSRUVCU0RfQUJJX1ZFTkRPUltdID0gIkZyZWVCU0QiOw0K
 IA0KK3N0YXRpYyBib29sZWFuX3QNCitfX2VsZk4oZnJlZWJzZF90cmFuc19v
 c3JlbCkoY29uc3QgRWxmX05vdGUgKm5vdGUsIGludDMyX3QgKm9zcmVsKQ0K
 K3sNCisNCisJKm9zcmVsID0gKihjb25zdCBpbnQzMl90ICopKG5vdGUgKyAx
 ICsNCisJICAgIHJvdW5kdXAyKG5vdGUtPm5fbmFtZXN6LCBzaXplb2YoRWxm
 MzJfQWRkcikpKTsNCisJcmV0dXJuIChUUlVFKTsNCit9DQorDQogRWxmX0Jy
 YW5kbm90ZSBfX2VsZk4oZnJlZWJzZF9icmFuZG5vdGUpID0gew0KIAkuaGRy
 Lm5fbmFtZXN6CT0gc2l6ZW9mKEZSRUVCU0RfQUJJX1ZFTkRPUiksDQogCS5o
 ZHIubl9kZXNjc3oJPSBzaXplb2YoaW50MzJfdCksDQogCS5oZHIubl90eXBl
 CT0gMSwNCiAJLnZlbmRvcgkJPSBGUkVFQlNEX0FCSV9WRU5ET1IsDQotCS5m
 bGFncwkJPSBCTl9DQU5fRkVUQ0hfT1NSRUwNCisJLmZsYWdzCQk9IEJOX1RS
 QU5TTEFURV9PU1JFTCwNCisJLnRyYW5zX29zcmVsCT0gX19lbGZOKGZyZWVi
 c2RfdHJhbnNfb3NyZWwpDQogfTsNCiANCiBpbnQNCkBAIC0xMzcxLDggKzEz
 ODIsOSBAQCBfX2VsZk4oY2hlY2tfbm90ZSkoc3RydWN0IGltYWdlX3BhcmFt
 cyAqaW1ncCwgRWxmX0JyYW5kbm90ZSAqY2hlY2tub3RlLA0KIAkJICogRmV0
 Y2ggdGhlIG9zcmVsZGF0ZSBmb3IgYmluYXJ5DQogCQkgKiBmcm9tIHRoZSBF
 TEYgT1NBQkktbm90ZSBpZiBuZWNlc3NhcnkuDQogCQkgKi8NCi0JCWlmICgo
 Y2hlY2tub3RlLT5mbGFncyAmIEJOX0NBTl9GRVRDSF9PU1JFTCkgIT0gMCAm
 Jg0KLQkJICAgIG9zcmVsICE9IE5VTEwpDQorCQlpZiAoY2hlY2tub3RlLT5m
 bGFncyAmIEJOX1RSQU5TTEFURV9PU1JFTCkNCisJCQlyZXR1cm4gKGNoZWNr
 bm90ZS0+dHJhbnNfb3NyZWwobm90ZSwgb3NyZWwpKTsNCisJCWVsc2UgaWYg
 KGNoZWNrbm90ZS0+ZmxhZ3MgJiBCTl9DQU5fRkVUQ0hfT1NSRUwpDQogCQkJ
 Km9zcmVsID0gKihjb25zdCBpbnQzMl90ICopIChub3RlX25hbWUgKw0KIAkJ
 CSAgICByb3VuZHVwMihjaGVja25vdGUtPmhkci5uX25hbWVzeiwNCiAJCQkg
 ICAgc2l6ZW9mKEVsZjMyX0FkZHIpKSk7DQpkaWZmIC0tZ2l0IGEvc3lzL3N5
 cy9pbWdhY3RfZWxmLmggYi9zeXMvc3lzL2ltZ2FjdF9lbGYuaA0KaW5kZXgg
 NjA5NzlkOS4uYmY2N2I5NCAxMDA2NDQNCi0tLSBhL3N5cy9zeXMvaW1nYWN0
 X2VsZi5oDQorKysgYi9zeXMvc3lzL2ltZ2FjdF9lbGYuaA0KQEAgLTU4LDcg
 KzU4LDkgQEAgdHlwZWRlZiBzdHJ1Y3Qgew0KIAlFbGZfTm90ZQloZHI7DQog
 CWNvbnN0IGNoYXIgKgl2ZW5kb3I7DQogCWludAkJZmxhZ3M7DQorCWJvb2xl
 YW5fdAkoKnRyYW5zX29zcmVsKShjb25zdCBFbGZfTm90ZSAqLCBpbnQzMl90
 ICopOw0KICNkZWZpbmUJQk5fQ0FOX0ZFVENIX09TUkVMCTB4MDAwMQ0KKyNk
 ZWZpbmUJQk5fVFJBTlNMQVRFX09TUkVMCTB4MDAwMg0KIH0gRWxmX0JyYW5k
 bm90ZTsNCiANCiB0eXBlZGVmIHN0cnVjdCB7DQo=
 
 --546530387-922302153-1249990938=:18053--
Responsible-Changed-From-To: dchagin->bz 
Responsible-Changed-By: bz 
Responsible-Changed-When: Tue Aug 18 12:40:31 UTC 2009 
Responsible-Changed-Why:  
Take. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=135468 

From: "Bjoern A. Zeeb" <bz@FreeBSD.org>
To: bug-followup@FreeBSD.org, Petr.Salinger@seznam.cz
Cc:  
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Sun, 23 Aug 2009 10:14:03 +0000 (UTC)

 Hi,
 
 could you give the following patch a try and report back?
 
 You can also temporary fetch it from:
 http://people.freebsd.org/~bz/20090822-01-linux-abi-kfreebsd.diff
 
 !
 ! Fix handling of .note.ABI-tag section for GNU systems [1].
 ! Handle Linux according to LSB Core Specification 4.0,
 ! Chapter 11. Object Format, 11.8. ABI note tag.
 !
 ! Add explicit handling for Debian GNU/kFreeBSD, which runs
 ! on our kernels as well [2].
 !
 ! In {amd64,i386}/trap.c, when checking osrel of the current process,
 ! also check the ABI to not change the signal behaviour for Linux
 ! binary processes now that we save an osrel version for all three
 ! from the lists above in struct proc [2].
 !
 ! These changes make it possible to run FreeBSD, Debian GNU/kFreeBSD
 ! and Linux binaries on the same machine again for at least i386 and
 ! amd64.
 !
 ! PR:		kern/135468
 ! Submitted by:	dchagin [1] (initial patch)
 ! Suggested by:	kib [2]
 ! Reviewed by:	kib
 ! Approved by:
 ! MFC After:	2 weeks
 !
 Index: sys/kern/imgact_elf.c
 ===================================================================
 --- sys/kern/imgact_elf.c	(revision 196355)
 +++ sys/kern/imgact_elf.c	(working copy)
 @@ -84,10 +84,13 @@ static int __elfN(load_file)(struct proc
       u_long *entry, size_t pagesize);
   static int __elfN(load_section)(struct vmspace *vmspace, vm_object_t object,
       vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz,
       vm_prot_t prot, size_t pagesize);
   static int __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp);
 +static boolean_t __elfN(freebsd_trans_osrel)(const Elf_Note *note,
 +    int32_t *osrel);
 +static boolean_t kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel);
   static boolean_t __elfN(check_note)(struct image_params *imgp,
       Elf_Brandnote *checknote, int32_t *osrel);
 
   SYSCTL_NODE(_kern, OID_AUTO, __CONCAT(elf, __ELF_WORD_SIZE), CTLFLAG_RW, 0,
       "");
 @@ -114,13 +117,60 @@ static const char FREEBSD_ABI_VENDOR[] =
   Elf_Brandnote __elfN(freebsd_brandnote) = {
   	.hdr.n_namesz	= sizeof(FREEBSD_ABI_VENDOR),
   	.hdr.n_descsz	= sizeof(int32_t),
   	.hdr.n_type	= 1,
   	.vendor		= FREEBSD_ABI_VENDOR,
 -	.flags		= BN_CAN_FETCH_OSREL
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= __elfN(freebsd_trans_osrel)
   };
 
 +static boolean_t
 +__elfN(freebsd_trans_osrel)(const Elf_Note *note, int32_t *osrel)
 +{
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +	*osrel = *(const int32_t *)(p);
 +
 +	return (TRUE);
 +}
 +
 +static const char GNU_ABI_VENDOR[] = "GNU";
 +static int GNU_KFREEBSD_ABI_DESC = 3;
 +
 +Elf_Brandnote __elfN(kfreebsd_brandnote) = {
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
 +	.hdr.n_type	= 1,
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= kfreebsd_trans_osrel
 +};
 +
 +static boolean_t
 +kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNU_KFREEBSD_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * Debian GNU/kFreeBSD embed the earliest compatible kernel version
 +	 * (__FreeBSD_version: <major><two digit minor>Rxx) in the LSB way.
 +	 */
 +	*osrel = desc[1] * 100000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 +
   int
   __elfN(insert_brand_entry)(Elf_Brandinfo *entry)
   {
   	int i;
 
 @@ -1369,15 +1419,13 @@ __elfN(check_note)(struct image_params *
 
   		/*
   		 * Fetch the osreldate for binary
   		 * from the ELF OSABI-note if necessary.
   		 */
 -		if ((checknote->flags & BN_CAN_FETCH_OSREL) != 0 &&
 -		    osrel != NULL)
 -			*osrel = *(const int32_t *) (note_name +
 -			    roundup2(checknote->hdr.n_namesz,
 -			    sizeof(Elf32_Addr)));
 +		if ((checknote->flags & BN_TRANSLATE_OSREL) != 0 &&
 +		    checknote->trans_osrel != NULL)
 +			return (checknote->trans_osrel(note, osrel));
   		return (TRUE);
 
   nextnote:
   		note = (const Elf_Note *)((const char *)(note + 1) +
   		    roundup2(note->n_namesz, sizeof(Elf32_Addr)) +
 Index: sys/sys/imgact_elf.h
 ===================================================================
 --- sys/sys/imgact_elf.h	(revision 196355)
 +++ sys/sys/imgact_elf.h	(working copy)
 @@ -56,11 +56,14 @@ typedef struct {
 
   typedef struct {
   	Elf_Note	hdr;
   	const char *	vendor;
   	int		flags;
 -#define	BN_CAN_FETCH_OSREL	0x0001
 +	boolean_t	(*trans_osrel)(const Elf_Note *, int32_t *);
 +#define	BN_CAN_FETCH_OSREL	0x0001	/* Deprecated. */
 +#define	BN_TRANSLATE_OSREL	0x0002	/* Use trans_osrel fetch osrel after */
 +					/* checking ABI contraint if needed. */
   } Elf_Brandnote;
 
   typedef struct {
   	int brand;
   	int machine;
 @@ -89,8 +92,9 @@ int	__elfN(coredump)(struct thread *, st
   /* Machine specific function to dump per-thread information. */
   void	__elfN(dump_thread)(struct thread *, void *, size_t *);
 
   extern int __elfN(fallback_brand);
   extern Elf_Brandnote __elfN(freebsd_brandnote);
 +extern Elf_Brandnote __elfN(kfreebsd_brandnote);
   #endif /* _KERNEL */
 
   #endif /* !_SYS_IMGACT_ELF_H_ */
 Index: sys/i386/linux/linux_sysvec.c
 ===================================================================
 --- sys/i386/linux/linux_sysvec.c	(revision 196355)
 +++ sys/i386/linux/linux_sysvec.c	(working copy)
 @@ -106,10 +106,11 @@ static void	linux_prepsyscall(struct tra
   		    caddr_t *params);
   static void     linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
   static void	exec_linux_setregs(struct thread *td, u_long entry,
   				   u_long stack, u_long ps_strings);
   static register_t *linux_copyout_strings(struct image_params *imgp);
 +static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
 
   static int linux_szplatform;
   const char *linux_platform;
 
   static eventhandler_tag linux_exit_tag;
 @@ -1025,18 +1026,42 @@ struct sysentvec elf_linux_sysvec = {
   	.sv_fixlimit	= NULL,
   	.sv_maxssiz	= NULL,
   	.sv_flags	= SV_ABI_LINUX | SV_IA32 | SV_ILP32
   };
 
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 
   static Elf_Brandnote linux_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
   	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux_trans_osrel
   };
 
   static Elf32_Brandinfo linux_brand = {
   	.brand		= ELFOSABI_LINUX,
   	.machine	= EM_386,
 Index: sys/amd64/linux32/linux32_sysvec.c
 ===================================================================
 --- sys/amd64/linux32/linux32_sysvec.c	(revision 196355)
 +++ sys/amd64/linux32/linux32_sysvec.c	(working copy)
 @@ -125,10 +125,11 @@ static void	linux_prepsyscall(struct tra
   		    caddr_t *params);
   static void     linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
   static void	exec_linux_setregs(struct thread *td, u_long entry,
   				   u_long stack, u_long ps_strings);
   static void	linux32_fixlimit(struct rlimit *rl, int which);
 +static boolean_t linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
 
   static eventhandler_tag linux_exit_tag;
   static eventhandler_tag linux_schedtail_tag;
   static eventhandler_tag linux_exec_tag;
 
 @@ -1064,18 +1065,42 @@ struct sysentvec elf_linux_sysvec = {
   	.sv_fixlimit	= linux32_fixlimit,
   	.sv_maxssiz	= &linux32_maxssiz,
   	.sv_flags	= SV_ABI_LINUX | SV_ILP32 | SV_IA32
   };
 
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux32_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 
   static Elf_Brandnote linux32_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
   	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux32_trans_osrel
   };
 
   static Elf32_Brandinfo linux_brand = {
   	.brand		= ELFOSABI_LINUX,
   	.machine	= EM_386,
 Index: sys/compat/ia32/ia32_sysvec.c
 ===================================================================
 --- sys/compat/ia32/ia32_sysvec.c	(revision 196355)
 +++ sys/compat/ia32/ia32_sysvec.c	(working copy)
 @@ -170,10 +170,25 @@ static Elf32_Brandinfo ia32_brand_oinfo
 
   SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY,
   	(sysinit_cfunc_t) elf32_insert_brand_entry,
   	&ia32_brand_oinfo);
 
 +static Elf32_Brandinfo kia32_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &ia32_freebsd_sysvec,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kia32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kia32_brand_info);
 +
 
   void
   elf32_dump_thread(struct thread *td __unused, void *dst __unused,
       size_t *off __unused)
   {
 Index: sys/i386/i386/elf_machdep.c
 ===================================================================
 --- sys/i386/i386/elf_machdep.c	(revision 196355)
 +++ sys/i386/i386/elf_machdep.c	(working copy)
 @@ -106,10 +106,26 @@ static Elf32_Brandinfo freebsd_brand_oin
 
   SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_ANY,
   	(sysinit_cfunc_t) elf32_insert_brand_entry,
   	&freebsd_brand_oinfo);
 
 +static Elf32_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &elf32_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
 
   void
   elf32_dump_thread(struct thread *td __unused, void *dst __unused,
       size_t *off __unused)
   {
 Index: sys/amd64/amd64/elf_machdep.c
 ===================================================================
 --- sys/amd64/amd64/elf_machdep.c	(revision 196355)
 +++ sys/amd64/amd64/elf_machdep.c	(working copy)
 @@ -33,10 +33,11 @@ __FBSDID("$FreeBSD$");
   #include <sys/imgact.h>
   #include <sys/linker.h>
   #include <sys/sysent.h>
   #include <sys/imgact_elf.h>
   #include <sys/syscall.h>
 +#include <sys/sysent.h>
   #include <sys/signalvar.h>
   #include <sys/vnode.h>
 
   #include <vm/vm.h>
   #include <vm/pmap.h>
 @@ -106,10 +107,26 @@ static Elf64_Brandinfo freebsd_brand_oin
 
   SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
   	(sysinit_cfunc_t) elf64_insert_brand_entry,
   	&freebsd_brand_oinfo);
 
 +static Elf64_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_X86_64,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld-kfreebsd-x86-64.so.1",
 +	.sysvec		= &elf64_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf64_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf64_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
 
   void
   elf64_dump_thread(struct thread *td __unused, void *dst __unused,
       size_t *off __unused)
   {
 Index: sys/i386/i386/trap.c
 ===================================================================
 --- sys/i386/i386/trap.c	(revision 196355)
 +++ sys/i386/i386/trap.c	(working copy)
 @@ -421,11 +421,13 @@ trap(struct trapframe *frame)
   					/*
   					 * Autodetect.
   					 * This check also covers the images
   					 * without the ABI-tag ELF note.
   					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
   						i = SIGSEGV;
   						ucode = SEGV_ACCERR;
   					} else {
   						i = SIGBUS;
   						ucode = BUS_PAGE_FAULT;
 Index: sys/amd64/amd64/trap.c
 ===================================================================
 --- sys/amd64/amd64/trap.c	(revision 196355)
 +++ sys/amd64/amd64/trap.c	(working copy)
 @@ -407,11 +407,13 @@ trap(struct trapframe *frame)
   					/*
   					 * Autodetect.
   					 * This check also covers the images
   					 * without the ABI-tag ELF note.
   					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
   						i = SIGSEGV;
   						ucode = SEGV_ACCERR;
   					} else {
   						i = SIGBUS;
   						ucode = BUS_PAGE_FAULT;
 
 -- 
 Bjoern A. Zeeb           What was I talking about and who are you again?

From: Petr Salinger <Petr.Salinger@seznam.cz>
To: "Bjoern A. Zeeb" <bz@FreeBSD.org>
Cc: bug-followup@FreeBSD.org
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Mon, 24 Aug 2009 13:45:32 +0200 (CEST)

 > could you give the following patch a try and report back?
 >
 > You can also temporary fetch it from:
 > http://people.freebsd.org/~bz/20090822-01-linux-abi-kfreebsd.diff
 
 I tested it against 7.2 kernel version, it looks fine for us.
 
 Thanks
 
  	Petr

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/135468: commit references a PR
Date: Mon, 24 Aug 2009 16:20:03 +0000 (UTC)

 Author: bz
 Date: Mon Aug 24 16:19:47 2009
 New Revision: 196512
 URL: http://svn.freebsd.org/changeset/base/196512
 
 Log:
   Fix handling of .note.ABI-tag section for GNU systems [1].
   Handle GNU/Linux according to LSB Core Specification 4.0,
   Chapter 11. Object Format, 11.8. ABI note tag.
   
   Also check the first word of desc, not only name, according to
   glibc abi-tags specification to distinguish between Linux and
   kFreeBSD.
   
   Add explicit handling for Debian GNU/kFreeBSD, which runs
   on our kernels as well [2].
   
   In {amd64,i386}/trap.c, when checking osrel of the current process,
   also check the ABI to not change the signal behaviour for Linux
   binary processes, now that we save an osrel version for all three
   from the lists above in struct proc [2].
   
   These changes make it possible to run FreeBSD, Debian GNU/kFreeBSD
   and Linux binaries on the same machine again for at least i386 and
   amd64, and no longer break kFreeBSD which was detected as GNU(/Linux).
   
   PR:		kern/135468
   Submitted by:	dchagin [1] (initial patch)
   Suggested by:	kib [2]
   Tested by:	Petr Salinger (Petr.Salinger seznam.cz) for kFreeBSD
   Reviewed by:	kib
   MFC after:	3 days
 
 Modified:
   head/sys/amd64/amd64/elf_machdep.c
   head/sys/amd64/amd64/trap.c
   head/sys/amd64/linux32/linux32_sysvec.c
   head/sys/compat/ia32/ia32_sysvec.c
   head/sys/i386/i386/elf_machdep.c
   head/sys/i386/i386/trap.c
   head/sys/i386/linux/linux_sysvec.c
   head/sys/kern/imgact_elf.c
   head/sys/sys/imgact_elf.h
 
 Modified: head/sys/amd64/amd64/elf_machdep.c
 ==============================================================================
 --- head/sys/amd64/amd64/elf_machdep.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/amd64/amd64/elf_machdep.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
  #include <sys/sysent.h>
  #include <sys/imgact_elf.h>
  #include <sys/syscall.h>
 +#include <sys/sysent.h>
  #include <sys/signalvar.h>
  #include <sys/vnode.h>
  
 @@ -108,6 +109,22 @@ SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf64_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf64_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_X86_64,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld-kfreebsd-x86-64.so.1",
 +	.sysvec		= &elf64_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf64_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf64_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf64_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: head/sys/amd64/amd64/trap.c
 ==============================================================================
 --- head/sys/amd64/amd64/trap.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/amd64/amd64/trap.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -409,7 +409,9 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: head/sys/amd64/linux32/linux32_sysvec.c
 ==============================================================================
 --- head/sys/amd64/linux32/linux32_sysvec.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/amd64/linux32/linux32_sysvec.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -127,6 +127,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static void	linux32_fixlimit(struct rlimit *rl, int which);
 +static boolean_t linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static eventhandler_tag linux_exit_tag;
  static eventhandler_tag linux_schedtail_tag;
 @@ -1066,14 +1067,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_flags	= SV_ABI_LINUX | SV_ILP32 | SV_IA32
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux32_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux32_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux32_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: head/sys/compat/ia32/ia32_sysvec.c
 ==============================================================================
 --- head/sys/compat/ia32/ia32_sysvec.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/compat/ia32/ia32_sysvec.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -172,6 +172,21 @@ SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&ia32_brand_oinfo);
  
 +static Elf32_Brandinfo kia32_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &ia32_freebsd_sysvec,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kia32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kia32_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: head/sys/i386/i386/elf_machdep.c
 ==============================================================================
 --- head/sys/i386/i386/elf_machdep.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/i386/i386/elf_machdep.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -108,6 +108,22 @@ SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf32_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &elf32_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: head/sys/i386/i386/trap.c
 ==============================================================================
 --- head/sys/i386/i386/trap.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/i386/i386/trap.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -423,7 +423,9 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: head/sys/i386/linux/linux_sysvec.c
 ==============================================================================
 --- head/sys/i386/linux/linux_sysvec.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/i386/linux/linux_sysvec.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -108,6 +108,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static register_t *linux_copyout_strings(struct image_params *imgp);
 +static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static int linux_szplatform;
  const char *linux_platform;
 @@ -1027,14 +1028,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_flags	= SV_ABI_LINUX | SV_IA32 | SV_ILP32
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: head/sys/kern/imgact_elf.c
 ==============================================================================
 --- head/sys/kern/imgact_elf.c	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/kern/imgact_elf.c	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -86,6 +86,9 @@ static int __elfN(load_section)(struct v
      vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz,
      vm_prot_t prot, size_t pagesize);
  static int __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp);
 +static boolean_t __elfN(freebsd_trans_osrel)(const Elf_Note *note,
 +    int32_t *osrel);
 +static boolean_t kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel);
  static boolean_t __elfN(check_note)(struct image_params *imgp,
      Elf_Brandnote *checknote, int32_t *osrel);
  
 @@ -116,9 +119,56 @@ Elf_Brandnote __elfN(freebsd_brandnote) 
  	.hdr.n_descsz	= sizeof(int32_t),
  	.hdr.n_type	= 1,
  	.vendor		= FREEBSD_ABI_VENDOR,
 -	.flags		= BN_CAN_FETCH_OSREL
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= __elfN(freebsd_trans_osrel)
  };
  
 +static boolean_t
 +__elfN(freebsd_trans_osrel)(const Elf_Note *note, int32_t *osrel)
 +{
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +	*osrel = *(const int32_t *)(p);
 +
 +	return (TRUE);
 +}
 +
 +static const char GNU_ABI_VENDOR[] = "GNU";
 +static int GNU_KFREEBSD_ABI_DESC = 3;
 +
 +Elf_Brandnote __elfN(kfreebsd_brandnote) = {
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
 +	.hdr.n_type	= 1,
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= kfreebsd_trans_osrel
 +};
 +
 +static boolean_t
 +kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNU_KFREEBSD_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * Debian GNU/kFreeBSD embed the earliest compatible kernel version
 +	 * (__FreeBSD_version: <major><two digit minor>Rxx) in the LSB way.
 +	 */
 +	*osrel = desc[1] * 100000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 +
  int
  __elfN(insert_brand_entry)(Elf_Brandinfo *entry)
  {
 @@ -1371,11 +1421,9 @@ __elfN(check_note)(struct image_params *
  		 * Fetch the osreldate for binary
  		 * from the ELF OSABI-note if necessary.
  		 */
 -		if ((checknote->flags & BN_CAN_FETCH_OSREL) != 0 &&
 -		    osrel != NULL)
 -			*osrel = *(const int32_t *) (note_name +
 -			    roundup2(checknote->hdr.n_namesz,
 -			    sizeof(Elf32_Addr)));
 +		if ((checknote->flags & BN_TRANSLATE_OSREL) != 0 &&
 +		    checknote->trans_osrel != NULL)
 +			return (checknote->trans_osrel(note, osrel));
  		return (TRUE);
  
  nextnote:
 
 Modified: head/sys/sys/imgact_elf.h
 ==============================================================================
 --- head/sys/sys/imgact_elf.h	Mon Aug 24 13:10:55 2009	(r196511)
 +++ head/sys/sys/imgact_elf.h	Mon Aug 24 16:19:47 2009	(r196512)
 @@ -58,7 +58,10 @@ typedef struct {
  	Elf_Note	hdr;
  	const char *	vendor;
  	int		flags;
 -#define	BN_CAN_FETCH_OSREL	0x0001
 +	boolean_t	(*trans_osrel)(const Elf_Note *, int32_t *);
 +#define	BN_CAN_FETCH_OSREL	0x0001	/* Deprecated. */
 +#define	BN_TRANSLATE_OSREL	0x0002	/* Use trans_osrel fetch osrel after */
 +					/* checking ABI contraint if needed. */
  } Elf_Brandnote;
  
  typedef struct {
 @@ -91,6 +94,7 @@ void	__elfN(dump_thread)(struct thread *
  
  extern int __elfN(fallback_brand);
  extern Elf_Brandnote __elfN(freebsd_brandnote);
 +extern Elf_Brandnote __elfN(kfreebsd_brandnote);
  #endif /* _KERNEL */
  
  #endif /* !_SYS_IMGACT_ELF_H_ */
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: bz 
State-Changed-When: Mon Aug 24 20:13:10 UTC 2009 
State-Changed-Why:  
Commit to HEAD done, MFC in a few days. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=135468 

From: "Bjoern A. Zeeb" <bz@FreeBSD.org>
To: bug-followup@FreeBSD.org
Cc: Petr.Salinger@seznam.cz
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Thu, 27 Aug 2009 14:16:24 +0000 (UTC)

 On Mon, 24 Aug 2009, Petr Salinger wrote:
 
 Hi,
 
 >> could you give the following patch a try and report back?
 >> 
 >> You can also temporary fetch it from:
 >> http://people.freebsd.org/~bz/20090822-01-linux-abi-kfreebsd.diff
 >
 > I tested it against 7.2 kernel version, it looks fine for us.
 
 Just curious how you tested it on 7.2 as the patch won't compile
 there?
 
 You could give this one a try on 7-STABLE though as I am about to MFC
 it there:
 http://people.freebsd.org/~bz/20090827-02-mfc7-r196512-abi-note.diff
 
 /bz
 
 -- 
 Bjoern A. Zeeb           What was I talking about and who are you again?

From: Petr Salinger <Petr.Salinger@seznam.cz>
To: "Bjoern A. Zeeb" <bz@FreeBSD.org>
Cc: bug-followup@FreeBSD.org
Subject: Re: kern/135468: broken detection of Linux binaries via ".note.ABI-tag"
 section.
Date: Thu, 27 Aug 2009 17:23:05 +0200 (CEST)

   This message is in MIME format.  The first part should be readable text,
   while the remaining parts are likely unreadable without MIME-aware tools.
 
 --546530387-1607261299-1251386585=:32320
 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
 
 >> I tested it against 7.2 kernel version, it looks fine for us.
 >
 > Just curious how you tested it on 7.2 as the patch won't compile
 > there?
 
 With attached patch.
 
 Petr
 --546530387-1607261299-1251386585=:32320
 Content-Type: TEXT/x-diff; charset=US-ASCII; name=011_brandinfo.diff
 Content-Transfer-Encoding: BASE64
 Content-ID: <Pine.LNX.4.62.0908271723051.32320@sci.felk.cvut.cz>
 Content-Description: 
 Content-Disposition: attachment; filename=011_brandinfo.diff
 
 SW5kZXg6IHNyYy9zeXMva2Vybi9pbWdhY3RfZWxmLmMNCj09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT0NCi0tLSBzcmMub3JpZy9zeXMva2Vybi9pbWdhY3RfZWxm
 LmMJMjAwOS0wOC0yNCAwOTo1NToyNC4wMDAwMDAwMDAgKzAyMDANCisrKyBz
 cmMvc3lzL2tlcm4vaW1nYWN0X2VsZi5jCTIwMDktMDgtMjQgMTA6MDY6NTku
 MDAwMDAwMDAwICswMjAwDQpAQCAtODYsNiArODYsOSBAQA0KICAgICB2bV9v
 ZmZzZXRfdCBvZmZzZXQsIGNhZGRyX3Qgdm1hZGRyLCBzaXplX3QgbWVtc3os
 IHNpemVfdCBmaWxzeiwNCiAgICAgdm1fcHJvdF90IHByb3QsIHNpemVfdCBw
 YWdlc2l6ZSk7DQogc3RhdGljIGludCBfX0NPTkNBVChleGVjXywgX19lbGZO
 KGltZ2FjdCkpKHN0cnVjdCBpbWFnZV9wYXJhbXMgKmltZ3ApOw0KK3N0YXRp
 YyBib29sZWFuX3QgX19lbGZOKGZyZWVic2RfdHJhbnNfb3NyZWwpKGNvbnN0
 IEVsZl9Ob3RlICpub3RlLA0KKyAgICBpbnQzMl90ICpvc3JlbCk7DQorc3Rh
 dGljIGJvb2xlYW5fdCBrZnJlZWJzZF90cmFuc19vc3JlbChjb25zdCBFbGZf
 Tm90ZSAqbm90ZSwgaW50MzJfdCAqb3NyZWwpOw0KIHN0YXRpYyBib29sZWFu
 X3QgX19lbGZOKGNoZWNrX25vdGUpKHN0cnVjdCBpbWFnZV9wYXJhbXMgKmlt
 Z3AsDQogICAgIEVsZl9CcmFuZG5vdGUgKmNoZWNrbm90ZSwgaW50MzJfdCAq
 b3NyZWwpOw0KIA0KQEAgLTExOSw5ICsxMjIsNTYgQEANCiAJLmhkci5uX2Rl
 c2Nzegk9IHNpemVvZihpbnQzMl90KSwNCiAJLmhkci5uX3R5cGUJPSAxLA0K
 IAkudmVuZG9yCQk9IEZSRUVCU0RfQUJJX1ZFTkRPUiwNCi0JLmZsYWdzCQk9
 IEJOX0NBTl9GRVRDSF9PU1JFTA0KKwkuZmxhZ3MJCT0gQk5fVFJBTlNMQVRF
 X09TUkVMLA0KKwkudHJhbnNfb3NyZWwJPSBfX2VsZk4oZnJlZWJzZF90cmFu
 c19vc3JlbCkNCiB9Ow0KIA0KK3N0YXRpYyBib29sZWFuX3QNCitfX2VsZk4o
 ZnJlZWJzZF90cmFuc19vc3JlbCkoY29uc3QgRWxmX05vdGUgKm5vdGUsIGlu
 dDMyX3QgKm9zcmVsKQ0KK3sNCisJdWludHB0cl90IHA7DQorDQorCXAgPSAo
 dWludHB0cl90KShub3RlICsgMSk7DQorCXAgKz0gcm91bmR1cDIobm90ZS0+
 bl9uYW1lc3osIHNpemVvZihFbGYzMl9BZGRyKSk7DQorCSpvc3JlbCA9ICoo
 Y29uc3QgaW50MzJfdCAqKShwKTsNCisNCisJcmV0dXJuIChUUlVFKTsNCit9
 DQorDQorc3RhdGljIGNvbnN0IGNoYXIgR05VX0FCSV9WRU5ET1JbXSA9ICJH
 TlUiOw0KK3N0YXRpYyBpbnQgR05VX0tGUkVFQlNEX0FCSV9ERVNDID0gMzsN
 CisNCitFbGZfQnJhbmRub3RlIF9fZWxmTihrZnJlZWJzZF9icmFuZG5vdGUp
 ID0gew0KKwkuaGRyLm5fbmFtZXN6CT0gc2l6ZW9mKEdOVV9BQklfVkVORE9S
 KSwNCisJLmhkci5uX2Rlc2Nzegk9IDE2LAkvKiBYWFggYXQgbGVhc3QgMTYg
 Ki8NCisJLmhkci5uX3R5cGUJPSAxLA0KKwkudmVuZG9yCQk9IEdOVV9BQklf
 VkVORE9SLA0KKwkuZmxhZ3MJCT0gQk5fVFJBTlNMQVRFX09TUkVMLA0KKwku
 dHJhbnNfb3NyZWwJPSBrZnJlZWJzZF90cmFuc19vc3JlbA0KK307DQorDQor
 c3RhdGljIGJvb2xlYW5fdA0KK2tmcmVlYnNkX3RyYW5zX29zcmVsKGNvbnN0
 IEVsZl9Ob3RlICpub3RlLCBpbnQzMl90ICpvc3JlbCkNCit7DQorCWNvbnN0
 IEVsZjMyX1dvcmQgKmRlc2M7DQorCXVpbnRwdHJfdCBwOw0KKw0KKwlwID0g
 KHVpbnRwdHJfdCkobm90ZSArIDEpOw0KKwlwICs9IHJvdW5kdXAyKG5vdGUt
 Pm5fbmFtZXN6LCBzaXplb2YoRWxmMzJfQWRkcikpOw0KKw0KKwlkZXNjID0g
 KGNvbnN0IEVsZjMyX1dvcmQgKilwOw0KKwlpZiAoZGVzY1swXSAhPSBHTlVf
 S0ZSRUVCU0RfQUJJX0RFU0MpDQorCQlyZXR1cm4gKEZBTFNFKTsNCisNCisJ
 LyoNCisJICogRGViaWFuIEdOVS9rRnJlZUJTRCBlbWJlZCB0aGUgZWFybGll
 c3QgY29tcGF0aWJsZSBrZXJuZWwgdmVyc2lvbg0KKwkgKiAoX19GcmVlQlNE
 X3ZlcnNpb246IDxtYWpvcj48dHdvIGRpZ2l0IG1pbm9yPlJ4eCkgaW4gdGhl
 IExTQiB3YXkuDQorCSAqLw0KKwkqb3NyZWwgPSBkZXNjWzFdICogMTAwMDAw
 ICsgZGVzY1syXSAqIDEwMDAgKyBkZXNjWzNdOw0KKw0KKwlyZXR1cm4gKFRS
 VUUpOw0KK30NCisNCiBpbnQNCiBfX2VsZk4oaW5zZXJ0X2JyYW5kX2VudHJ5
 KShFbGZfQnJhbmRpbmZvICplbnRyeSkNCiB7DQpAQCAtMTQwMSwxMSArMTQ1
 MSw5IEBADQogCQkgKiBGZXRjaCB0aGUgb3NyZWxkYXRlIGZvciBiaW5hcnkN
 CiAJCSAqIGZyb20gdGhlIEVMRiBPU0FCSS1ub3RlIGlmIG5lY2Vzc2FyeS4N
 CiAJCSAqLw0KLQkJaWYgKChjaGVja25vdGUtPmZsYWdzICYgQk5fQ0FOX0ZF
 VENIX09TUkVMKSAhPSAwICYmDQotCQkgICAgb3NyZWwgIT0gTlVMTCkNCi0J
 CQkqb3NyZWwgPSAqKGNvbnN0IGludDMyX3QgKikgKG5vdGVfbmFtZSArDQot
 CQkJICAgIHJvdW5kdXAyKGNoZWNrbm90ZS0+aGRyLm5fbmFtZXN6LA0KLQkJ
 CSAgICBzaXplb2YoRWxmMzJfQWRkcikpKTsNCisJCWlmICgoY2hlY2tub3Rl
 LT5mbGFncyAmIEJOX1RSQU5TTEFURV9PU1JFTCkgIT0gMCAmJg0KKwkJICAg
 IGNoZWNrbm90ZS0+dHJhbnNfb3NyZWwgIT0gTlVMTCkNCisJCQlyZXR1cm4g
 KGNoZWNrbm90ZS0+dHJhbnNfb3NyZWwobm90ZSwgb3NyZWwpKTsNCiAJCXJl
 dHVybiAoVFJVRSk7DQogDQogbmV4dG5vdGU6DQpJbmRleDogc3JjL3N5cy9z
 eXMvaW1nYWN0X2VsZi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g
 c3JjLm9yaWcvc3lzL3N5cy9pbWdhY3RfZWxmLmgJMjAwOS0wOC0yNCAwOTo1
 NDo1OC4wMDAwMDAwMDAgKzAyMDANCisrKyBzcmMvc3lzL3N5cy9pbWdhY3Rf
 ZWxmLmgJMjAwOS0wOC0yNCAxMDowNzoyOS4wMDAwMDAwMDAgKzAyMDANCkBA
 IC01OSw3ICs1OSwxMCBAQA0KIAlFbGZfTm90ZQloZHI7DQogCWNvbnN0IGNo
 YXIgKgl2ZW5kb3I7DQogCWludAkJZmxhZ3M7DQotI2RlZmluZQlCTl9DQU5f
 RkVUQ0hfT1NSRUwJMHgwMDAxDQorCWJvb2xlYW5fdAkoKnRyYW5zX29zcmVs
 KShjb25zdCBFbGZfTm90ZSAqLCBpbnQzMl90ICopOw0KKyNkZWZpbmUJQk5f
 Q0FOX0ZFVENIX09TUkVMCTB4MDAwMQkvKiBEZXByZWNhdGVkLiAqLw0KKyNk
 ZWZpbmUJQk5fVFJBTlNMQVRFX09TUkVMCTB4MDAwMgkvKiBVc2UgdHJhbnNf
 b3NyZWwgZmV0Y2ggb3NyZWwgYWZ0ZXIgKi8NCisJCQkJCS8qIGNoZWNraW5n
 IEFCSSBjb250cmFpbnQgaWYgbmVlZGVkLiAqLw0KIH0gRWxmX0JyYW5kbm90
 ZTsNCiANCiB0eXBlZGVmIHN0cnVjdCB7DQpAQCAtOTEsNiArOTQsNyBAQA0K
 IHZvaWQJX19lbGZOKGR1bXBfdGhyZWFkKShzdHJ1Y3QgdGhyZWFkICosIHZv
 aWQgKiwgc2l6ZV90ICopOw0KIA0KIGV4dGVybglpbnQgX19lbGZOKGZhbGxi
 YWNrX2JyYW5kKTsNCitleHRlcm4gRWxmX0JyYW5kbm90ZSBfX2VsZk4oa2Zy
 ZWVic2RfYnJhbmRub3RlKTsNCiBleHRlcm4gRWxmX0JyYW5kbm90ZSBfX2Vs
 Zk4oZnJlZWJzZF9icmFuZG5vdGUpOw0KICNlbmRpZiAvKiBfS0VSTkVMICov
 DQogDQpJbmRleDogc3JjL3N5cy9pMzg2L2xpbnV4L2xpbnV4X3N5c3ZlYy5j
 DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc3JjLm9yaWcvc3lzL2kz
 ODYvbGludXgvbGludXhfc3lzdmVjLmMJMjAwOS0wOC0yNCAwOTo1NToxNi4w
 MDAwMDAwMDAgKzAyMDANCisrKyBzcmMvc3lzL2kzODYvbGludXgvbGludXhf
 c3lzdmVjLmMJMjAwOS0wOC0yNCAxMDoxMDo0Mi4wMDAwMDAwMDAgKzAyMDAN
 CkBAIC0xMDYsNiArMTA2LDcgQEANCiBzdGF0aWMgdm9pZAlleGVjX2xpbnV4
 X3NldHJlZ3Moc3RydWN0IHRocmVhZCAqdGQsIHVfbG9uZyBlbnRyeSwNCiAJ
 CQkJICAgdV9sb25nIHN0YWNrLCB1X2xvbmcgcHNfc3RyaW5ncyk7DQogc3Rh
 dGljIHJlZ2lzdGVyX3QgKmxpbnV4X2NvcHlvdXRfc3RyaW5ncyhzdHJ1Y3Qg
 aW1hZ2VfcGFyYW1zICppbWdwKTsNCitzdGF0aWMgYm9vbGVhbl90IGxpbnV4
 X3RyYW5zX29zcmVsKGNvbnN0IEVsZl9Ob3RlICpub3RlLCBpbnQzMl90ICpv
 c3JlbCk7DQogDQogc3RhdGljIGludCBsaW51eF9zenBsYXRmb3JtOw0KIGNv
 bnN0IGNoYXIgKmxpbnV4X3BsYXRmb3JtOw0KQEAgLTEwMTcsMTQgKzEwMTgs
 MzkgQEANCiAJLnN2X21heHNzaXoJPSBOVUxMDQogfTsNCiANCi1zdGF0aWMg
 Y2hhciBHTlVMSU5VWF9BQklfVkVORE9SW10gPSAiR05VIjsNCitzdGF0aWMg
 Y2hhciBHTlVfQUJJX1ZFTkRPUltdID0gIkdOVSI7DQorc3RhdGljIGludCBH
 TlVMSU5VWF9BQklfREVTQyA9IDA7DQorDQorIHN0YXRpYyBib29sZWFuX3QN
 CisgbGludXhfdHJhbnNfb3NyZWwoY29uc3QgRWxmX05vdGUgKm5vdGUsIGlu
 dDMyX3QgKm9zcmVsKQ0KKyB7DQorICAgICAgIGNvbnN0IEVsZjMyX1dvcmQg
 KmRlc2M7DQorICAgICAgIHVpbnRwdHJfdCBwOw0KKw0KKyAgICAgICBwID0g
 KHVpbnRwdHJfdCkobm90ZSArIDEpOw0KKyAgICAgICBwICs9IHJvdW5kdXAy
 KG5vdGUtPm5fbmFtZXN6LCBzaXplb2YoRWxmMzJfQWRkcikpOw0KKw0KKyAg
 ICAgICBkZXNjID0gKGNvbnN0IEVsZjMyX1dvcmQgKilwOw0KKyAgICAgICBp
 ZiAoZGVzY1swXSAhPSBHTlVMSU5VWF9BQklfREVTQykNCisgICAgICAgICAg
 ICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgICAgICAgLyoNCisgICAgICAg
 ICogRm9yIGxpbnV4IHdlIGVuY29kZSBvc3JlbCBhcyBmb2xsb3dzIChzZWUg
 bGludXhfbWliLmMpOg0KKyAgICAgICAgKiBWVlZNTU1JSUkgKHZlcnNpb24s
 IG1ham9yLCBtaW5vciksIHNlZSBsaW51eF9taWIuYy4NCisgICAgICAgICov
 DQorICAgICAgICpvc3JlbCA9IGRlc2NbMV0gKiAxMDAwMDAwICsgZGVzY1sy
 XSAqIDEwMDAgKyBkZXNjWzNdOw0KKw0KKyAgICAgICByZXR1cm4gKFRSVUUp
 Ow0KKyB9DQogDQogc3RhdGljIEVsZl9CcmFuZG5vdGUgbGludXhfYnJhbmRu
 b3RlID0gew0KLQkuaGRyLm5fbmFtZXN6CT0gc2l6ZW9mKEdOVUxJTlVYX0FC
 SV9WRU5ET1IpLA0KKwkuaGRyLm5fbmFtZXN6CT0gc2l6ZW9mKEdOVV9BQklf
 VkVORE9SKSwNCiAJLmhkci5uX2Rlc2Nzegk9IDE2LA0KIAkuaGRyLm5fdHlw
 ZQk9IDEsDQotCS52ZW5kb3IJCT0gR05VTElOVVhfQUJJX1ZFTkRPUiwNCi0J
 LmZsYWdzCQk9IDANCisJLnZlbmRvcgkJPSBHTlVfQUJJX1ZFTkRPUiwNCisJ
 LmZsYWdzICAgICAgICAgID0gQk5fVFJBTlNMQVRFX09TUkVMLA0KKwkudHJh
 bnNfb3NyZWwgICAgPSBsaW51eF90cmFuc19vc3JlbA0KKw0KIH07DQogDQog
 c3RhdGljIEVsZjMyX0JyYW5kaW5mbyBsaW51eF9icmFuZCA9IHsNCkluZGV4
 OiBzcmMvc3lzL2FtZDY0L2xpbnV4MzIvbGludXgzMl9zeXN2ZWMuYw0KPT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNyYy5vcmlnL3N5cy9hbWQ2NC9s
 aW51eDMyL2xpbnV4MzJfc3lzdmVjLmMJMjAwOS0wOC0yNCAwOTo1NToyNC4w
 MDAwMDAwMDAgKzAyMDANCisrKyBzcmMvc3lzL2FtZDY0L2xpbnV4MzIvbGlu
 dXgzMl9zeXN2ZWMuYwkyMDA5LTA4LTI0IDEwOjEzOjMyLjAwMDAwMDAwMCAr
 MDIwMA0KQEAgLTEwNDcsMTQgKzEwNDcsNDAgQEANCiAJLnN2X21heHNzaXoJ
 PSAmbGludXgzMl9tYXhzc2l6LA0KIH07DQogDQotc3RhdGljIGNoYXIgR05V
 TElOVVhfQUJJX1ZFTkRPUltdID0gIkdOVSI7DQorc3RhdGljIGNoYXIgR05V
 X0FCSV9WRU5ET1JbXSA9ICJHTlUiOw0KK3N0YXRpYyBpbnQgR05VTElOVVhf
 QUJJX0RFU0MgPSAwOw0KKw0KKyBzdGF0aWMgYm9vbGVhbl90DQorIGxpbnV4
 MzJfdHJhbnNfb3NyZWwoY29uc3QgRWxmX05vdGUgKm5vdGUsIGludDMyX3Qg
 Km9zcmVsKQ0KKyB7DQorICAgICAgIGNvbnN0IEVsZjMyX1dvcmQgKmRlc2M7
 DQorICAgICAgIHVpbnRwdHJfdCBwOw0KKw0KKyAgICAgICBwID0gKHVpbnRw
 dHJfdCkobm90ZSArIDEpOw0KKyAgICAgICBwICs9IHJvdW5kdXAyKG5vdGUt
 Pm5fbmFtZXN6LCBzaXplb2YoRWxmMzJfQWRkcikpOw0KKw0KKyAgICAgICBk
 ZXNjID0gKGNvbnN0IEVsZjMyX1dvcmQgKilwOw0KKyAgICAgICBpZiAoZGVz
 Y1swXSAhPSBHTlVMSU5VWF9BQklfREVTQykNCisgICAgICAgICAgICAgICBy
 ZXR1cm4gKEZBTFNFKTsNCisNCisgICAgICAgLyoNCisgICAgICAgICogRm9y
 IGxpbnV4IHdlIGVuY29kZSBvc3JlbCBhcyBmb2xsb3dzIChzZWUgbGludXhf
 bWliLmMpOg0KKyAgICAgICAgKiBWVlZNTU1JSUkgKHZlcnNpb24sIG1ham9y
 LCBtaW5vciksIHNlZSBsaW51eF9taWIuYy4NCisgICAgICAgICovDQorICAg
 ICAgICpvc3JlbCA9IGRlc2NbMV0gKiAxMDAwMDAwICsgZGVzY1syXSAqIDEw
 MDAgKyBkZXNjWzNdOw0KKw0KKyAgICAgICByZXR1cm4gKFRSVUUpOw0KKyB9
 DQorDQorDQogDQogc3RhdGljIEVsZl9CcmFuZG5vdGUgbGludXgzMl9icmFu
 ZG5vdGUgPSB7DQotCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05VTElOVVhf
 QUJJX1ZFTkRPUiksDQorCS5oZHIubl9uYW1lc3oJPSBzaXplb2YoR05VX0FC
 SV9WRU5ET1IpLA0KIAkuaGRyLm5fZGVzY3N6CT0gMTYsDQogCS5oZHIubl90
 eXBlCT0gMSwNCi0JLnZlbmRvcgkJPSBHTlVMSU5VWF9BQklfVkVORE9SLA0K
 LQkuZmxhZ3MJCT0gMA0KKwkudmVuZG9yCQk9IEdOVV9BQklfVkVORE9SLA0K
 KyAgICAgICAgLmZsYWdzICAgICAgICAgID0gQk5fVFJBTlNMQVRFX09TUkVM
 LA0KKyAgICAgICAgLnRyYW5zX29zcmVsICAgID0gbGludXgzMl90cmFuc19v
 c3JlbA0KIH07DQogDQogc3RhdGljIEVsZjMyX0JyYW5kaW5mbyBsaW51eF9i
 cmFuZCA9IHsNCkluZGV4OiBzcmMvc3lzL2NvbXBhdC9pYTMyL2lhMzJfc3lz
 dmVjLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMub3JpZy9z
 eXMvY29tcGF0L2lhMzIvaWEzMl9zeXN2ZWMuYwkyMDA5LTA4LTI0IDA5OjU1
 OjAyLjAwMDAwMDAwMCArMDIwMA0KKysrIHNyYy9zeXMvY29tcGF0L2lhMzIv
 aWEzMl9zeXN2ZWMuYwkyMDA5LTA4LTI0IDEwOjA2OjU5LjAwMDAwMDAwMCAr
 MDIwMA0KQEAgLTE3MSw2ICsxNzEsMjEgQEANCiAJKHN5c2luaXRfY2Z1bmNf
 dCkgZWxmMzJfaW5zZXJ0X2JyYW5kX2VudHJ5LA0KIAkmaWEzMl9icmFuZF9v
 aW5mbyk7DQogDQorc3RhdGljIEVsZjMyX0JyYW5kaW5mbyBraWEzMl9icmFu
 ZF9pbmZvID0gew0KKwkuYnJhbmQJCT0gRUxGT1NBQklfRlJFRUJTRCwNCisJ
 Lm1hY2hpbmUJPSBFTV8zODYsDQorCS5jb21wYXRfM19icmFuZAk9ICJGcmVl
 QlNEIiwNCisJLmVtdWxfcGF0aAk9IE5VTEwsDQorCS5pbnRlcnBfcGF0aAk9
 ICIvbGliL2xkLnNvLjEiLA0KKwkuc3lzdmVjCQk9ICZpYTMyX2ZyZWVic2Rf
 c3lzdmVjLA0KKwkuYnJhbmRfbm90ZQk9ICZlbGYzMl9rZnJlZWJzZF9icmFu
 ZG5vdGUsDQorCS5mbGFncwkJPSBCSV9DQU5fRVhFQ19EWU4gfCBCSV9CUkFO
 RF9OT1RFDQorfTsNCisNCitTWVNJTklUKGtpYTMyLCBTSV9TVUJfRVhFQywg
 U0lfT1JERVJfQU5ZLA0KKwkoc3lzaW5pdF9jZnVuY190KSBlbGYzMl9pbnNl
 cnRfYnJhbmRfZW50cnksDQorCSZraWEzMl9icmFuZF9pbmZvKTsNCisNCiAN
 CiB2b2lkDQogZWxmMzJfZHVtcF90aHJlYWQoc3RydWN0IHRocmVhZCAqdGQg
 X191bnVzZWQsIHZvaWQgKmRzdCBfX3VudXNlZCwNCkluZGV4OiBzcmMvc3lz
 L2kzODYvaTM4Ni9lbGZfbWFjaGRlcC5jDQo9PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09DQotLS0gc3JjLm9yaWcvc3lzL2kzODYvaTM4Ni9lbGZfbWFjaGRlcC5j
 CTIwMDktMDgtMjQgMDk6NTU6MTcuMDAwMDAwMDAwICswMjAwDQorKysgc3Jj
 L3N5cy9pMzg2L2kzODYvZWxmX21hY2hkZXAuYwkyMDA5LTA4LTI0IDEwOjA2
 OjU5LjAwMDAwMDAwMCArMDIwMA0KQEAgLTEwNyw2ICsxMDcsMjIgQEANCiAJ
 KHN5c2luaXRfY2Z1bmNfdCkgZWxmMzJfaW5zZXJ0X2JyYW5kX2VudHJ5LA0K
 IAkmZnJlZWJzZF9icmFuZF9vaW5mbyk7DQogDQorc3RhdGljIEVsZjMyX0Jy
 YW5kaW5mbyBrZnJlZWJzZF9icmFuZF9pbmZvID0gew0KKwkuYnJhbmQJCT0g
 RUxGT1NBQklfRlJFRUJTRCwNCisJLm1hY2hpbmUJPSBFTV8zODYsDQorCS5j
 b21wYXRfM19icmFuZAk9ICJGcmVlQlNEIiwNCisJLmVtdWxfcGF0aAk9IE5V
 TEwsDQorCS5pbnRlcnBfcGF0aAk9ICIvbGliL2xkLnNvLjEiLA0KKwkuc3lz
 dmVjCQk9ICZlbGYzMl9mcmVlYnNkX3N5c3ZlYywNCisJLmludGVycF9uZXdw
 YXRoCT0gTlVMTCwNCisJLmJyYW5kX25vdGUJPSAmZWxmMzJfa2ZyZWVic2Rf
 YnJhbmRub3RlLA0KKwkuZmxhZ3MJCT0gQklfQ0FOX0VYRUNfRFlOIHwgQklf
 QlJBTkRfTk9URQ0KK307DQorDQorU1lTSU5JVChrZWxmMzIsIFNJX1NVQl9F
 WEVDLCBTSV9PUkRFUl9BTlksDQorCShzeXNpbml0X2NmdW5jX3QpIGVsZjMy
 X2luc2VydF9icmFuZF9lbnRyeSwNCisJJmtmcmVlYnNkX2JyYW5kX2luZm8p
 Ow0KKw0KIA0KIHZvaWQNCiBlbGYzMl9kdW1wX3RocmVhZChzdHJ1Y3QgdGhy
 ZWFkICp0ZCBfX3VudXNlZCwgdm9pZCAqZHN0IF9fdW51c2VkLA0KSW5kZXg6
 IHNyYy9zeXMvYW1kNjQvYW1kNjQvZWxmX21hY2hkZXAuYw0KPT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PQ0KLS0tIHNyYy5vcmlnL3N5cy9hbWQ2NC9hbWQ2NC9l
 bGZfbWFjaGRlcC5jCTIwMDktMDgtMjQgMDk6NTQ6MzQuMDAwMDAwMDAwICsw
 MjAwDQorKysgc3JjL3N5cy9hbWQ2NC9hbWQ2NC9lbGZfbWFjaGRlcC5jCTIw
 MDktMDgtMjQgMTA6MDY6NTkuMDAwMDAwMDAwICswMjAwDQpAQCAtMzUsNiAr
 MzUsNyBAQA0KICNpbmNsdWRlIDxzeXMvc3lzZW50Lmg+DQogI2luY2x1ZGUg
 PHN5cy9pbWdhY3RfZWxmLmg+DQogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+
 DQorI2luY2x1ZGUgPHN5cy9zeXNlbnQuaD4NCiAjaW5jbHVkZSA8c3lzL3Np
 Z25hbHZhci5oPg0KICNpbmNsdWRlIDxzeXMvdm5vZGUuaD4NCiANCkBAIC0x
 MDcsNiArMTA4LDIyIEBADQogCShzeXNpbml0X2NmdW5jX3QpIGVsZjY0X2lu
 c2VydF9icmFuZF9lbnRyeSwNCiAJJmZyZWVic2RfYnJhbmRfb2luZm8pOw0K
 IA0KK3N0YXRpYyBFbGY2NF9CcmFuZGluZm8ga2ZyZWVic2RfYnJhbmRfaW5m
 byA9IHsNCisJLmJyYW5kCQk9IEVMRk9TQUJJX0ZSRUVCU0QsDQorCS5tYWNo
 aW5lCT0gRU1fWDg2XzY0LA0KKwkuY29tcGF0XzNfYnJhbmQJPSAiRnJlZUJT
 RCIsDQorCS5lbXVsX3BhdGgJPSBOVUxMLA0KKwkuaW50ZXJwX3BhdGgJPSAi
 L2xpYi9sZC1rZnJlZWJzZC14ODYtNjQuc28uMSIsDQorCS5zeXN2ZWMJCT0g
 JmVsZjY0X2ZyZWVic2Rfc3lzdmVjLA0KKwkuaW50ZXJwX25ld3BhdGgJPSBO
 VUxMLA0KKwkuYnJhbmRfbm90ZQk9ICZlbGY2NF9rZnJlZWJzZF9icmFuZG5v
 dGUsDQorCS5mbGFncwkJPSBCSV9DQU5fRVhFQ19EWU4gfCBCSV9CUkFORF9O
 T1RFDQorfTsNCisNCitTWVNJTklUKGtlbGY2NCwgU0lfU1VCX0VYRUMsIFNJ
 X09SREVSX0FOWSwNCisJKHN5c2luaXRfY2Z1bmNfdCkgZWxmNjRfaW5zZXJ0
 X2JyYW5kX2VudHJ5LA0KKwkma2ZyZWVic2RfYnJhbmRfaW5mbyk7DQorDQog
 DQogdm9pZA0KIGVsZjY0X2R1bXBfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKnRk
 IF9fdW51c2VkLCB2b2lkICpkc3QgX191bnVzZWQsDQo=
 
 --546530387-1607261299-1251386585=:32320--

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/135468: commit references a PR
Date: Thu, 27 Aug 2009 17:34:23 +0000 (UTC)

 Author: bz
 Date: Thu Aug 27 17:34:13 2009
 New Revision: 196601
 URL: http://svn.freebsd.org/changeset/base/196601
 
 Log:
   MFC r196512:
   
     Fix handling of .note.ABI-tag section for GNU systems [1].
     Handle GNU/Linux according to LSB Core Specification 4.0,
     Chapter 11. Object Format, 11.8. ABI note tag.
   
     Also check the first word of desc, not only name, according to
     glibc abi-tags specification to distinguish between Linux and
     kFreeBSD.
   
     Add explicit handling for Debian GNU/kFreeBSD, which runs
     on our kernels as well [2].
   
     In {amd64,i386}/trap.c, when checking osrel of the current process,
     also check the ABI to not change the signal behaviour for Linux
     binary processes, now that we save an osrel version for all three
     from the lists above in struct proc [2].
   
     These changes make it possible to run FreeBSD, Debian GNU/kFreeBSD
     and Linux binaries on the same machine again for at least i386 and
     amd64, and no longer break kFreeBSD which was detected as GNU(/Linux).
   
   PR:		kern/135468
   Submitted by:	dchagin [1] (initial patch)
   Suggested by:	kib [2]
   Tested by:	Petr Salinger (Petr.Salinger seznam.cz) for kFreeBSD
   Reviewed by:	kib
   Approved by:	re (kensmith)
 
 Modified:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/amd64/elf_machdep.c
   stable/8/sys/amd64/amd64/trap.c
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/amd64/linux32/linux32_sysvec.c
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/compat/ia32/ia32_sysvec.c
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/xen/xenpci/   (props changed)
   stable/8/sys/i386/i386/elf_machdep.c
   stable/8/sys/i386/i386/trap.c
   stable/8/sys/i386/linux/linux_sysvec.c
   stable/8/sys/kern/imgact_elf.c
   stable/8/sys/sys/imgact_elf.h
 
 Modified: stable/8/sys/amd64/amd64/elf_machdep.c
 ==============================================================================
 --- stable/8/sys/amd64/amd64/elf_machdep.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/amd64/amd64/elf_machdep.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
  #include <sys/sysent.h>
  #include <sys/imgact_elf.h>
  #include <sys/syscall.h>
 +#include <sys/sysent.h>
  #include <sys/signalvar.h>
  #include <sys/vnode.h>
  
 @@ -108,6 +109,22 @@ SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf64_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf64_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_X86_64,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld-kfreebsd-x86-64.so.1",
 +	.sysvec		= &elf64_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf64_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf64_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf64_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/8/sys/amd64/amd64/trap.c
 ==============================================================================
 --- stable/8/sys/amd64/amd64/trap.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/amd64/amd64/trap.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -409,7 +409,9 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: stable/8/sys/amd64/linux32/linux32_sysvec.c
 ==============================================================================
 --- stable/8/sys/amd64/linux32/linux32_sysvec.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/amd64/linux32/linux32_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -127,6 +127,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static void	linux32_fixlimit(struct rlimit *rl, int which);
 +static boolean_t linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static eventhandler_tag linux_exit_tag;
  static eventhandler_tag linux_schedtail_tag;
 @@ -1066,14 +1067,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_flags	= SV_ABI_LINUX | SV_ILP32 | SV_IA32
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux32_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux32_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux32_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: stable/8/sys/compat/ia32/ia32_sysvec.c
 ==============================================================================
 --- stable/8/sys/compat/ia32/ia32_sysvec.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/compat/ia32/ia32_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -172,6 +172,21 @@ SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&ia32_brand_oinfo);
  
 +static Elf32_Brandinfo kia32_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &ia32_freebsd_sysvec,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kia32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kia32_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/8/sys/i386/i386/elf_machdep.c
 ==============================================================================
 --- stable/8/sys/i386/i386/elf_machdep.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/i386/i386/elf_machdep.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -108,6 +108,22 @@ SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf32_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &elf32_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/8/sys/i386/i386/trap.c
 ==============================================================================
 --- stable/8/sys/i386/i386/trap.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/i386/i386/trap.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -423,7 +423,9 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if (SV_CURPROC_ABI() ==
 +					    SV_ABI_FREEBSD &&
 +					    p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: stable/8/sys/i386/linux/linux_sysvec.c
 ==============================================================================
 --- stable/8/sys/i386/linux/linux_sysvec.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/i386/linux/linux_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -108,6 +108,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static register_t *linux_copyout_strings(struct image_params *imgp);
 +static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static int linux_szplatform;
  const char *linux_platform;
 @@ -1027,14 +1028,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_flags	= SV_ABI_LINUX | SV_IA32 | SV_ILP32
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: stable/8/sys/kern/imgact_elf.c
 ==============================================================================
 --- stable/8/sys/kern/imgact_elf.c	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/kern/imgact_elf.c	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -86,6 +86,9 @@ static int __elfN(load_section)(struct v
      vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz,
      vm_prot_t prot, size_t pagesize);
  static int __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp);
 +static boolean_t __elfN(freebsd_trans_osrel)(const Elf_Note *note,
 +    int32_t *osrel);
 +static boolean_t kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel);
  static boolean_t __elfN(check_note)(struct image_params *imgp,
      Elf_Brandnote *checknote, int32_t *osrel);
  
 @@ -116,9 +119,56 @@ Elf_Brandnote __elfN(freebsd_brandnote) 
  	.hdr.n_descsz	= sizeof(int32_t),
  	.hdr.n_type	= 1,
  	.vendor		= FREEBSD_ABI_VENDOR,
 -	.flags		= BN_CAN_FETCH_OSREL
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= __elfN(freebsd_trans_osrel)
  };
  
 +static boolean_t
 +__elfN(freebsd_trans_osrel)(const Elf_Note *note, int32_t *osrel)
 +{
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +	*osrel = *(const int32_t *)(p);
 +
 +	return (TRUE);
 +}
 +
 +static const char GNU_ABI_VENDOR[] = "GNU";
 +static int GNU_KFREEBSD_ABI_DESC = 3;
 +
 +Elf_Brandnote __elfN(kfreebsd_brandnote) = {
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
 +	.hdr.n_type	= 1,
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= kfreebsd_trans_osrel
 +};
 +
 +static boolean_t
 +kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNU_KFREEBSD_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * Debian GNU/kFreeBSD embed the earliest compatible kernel version
 +	 * (__FreeBSD_version: <major><two digit minor>Rxx) in the LSB way.
 +	 */
 +	*osrel = desc[1] * 100000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 +
  int
  __elfN(insert_brand_entry)(Elf_Brandinfo *entry)
  {
 @@ -1371,11 +1421,9 @@ __elfN(check_note)(struct image_params *
  		 * Fetch the osreldate for binary
  		 * from the ELF OSABI-note if necessary.
  		 */
 -		if ((checknote->flags & BN_CAN_FETCH_OSREL) != 0 &&
 -		    osrel != NULL)
 -			*osrel = *(const int32_t *) (note_name +
 -			    roundup2(checknote->hdr.n_namesz,
 -			    sizeof(Elf32_Addr)));
 +		if ((checknote->flags & BN_TRANSLATE_OSREL) != 0 &&
 +		    checknote->trans_osrel != NULL)
 +			return (checknote->trans_osrel(note, osrel));
  		return (TRUE);
  
  nextnote:
 
 Modified: stable/8/sys/sys/imgact_elf.h
 ==============================================================================
 --- stable/8/sys/sys/imgact_elf.h	Thu Aug 27 17:33:44 2009	(r196600)
 +++ stable/8/sys/sys/imgact_elf.h	Thu Aug 27 17:34:13 2009	(r196601)
 @@ -58,7 +58,10 @@ typedef struct {
  	Elf_Note	hdr;
  	const char *	vendor;
  	int		flags;
 -#define	BN_CAN_FETCH_OSREL	0x0001
 +	boolean_t	(*trans_osrel)(const Elf_Note *, int32_t *);
 +#define	BN_CAN_FETCH_OSREL	0x0001	/* Deprecated. */
 +#define	BN_TRANSLATE_OSREL	0x0002	/* Use trans_osrel fetch osrel after */
 +					/* checking ABI contraint if needed. */
  } Elf_Brandnote;
  
  typedef struct {
 @@ -91,6 +94,7 @@ void	__elfN(dump_thread)(struct thread *
  
  extern int __elfN(fallback_brand);
  extern Elf_Brandnote __elfN(freebsd_brandnote);
 +extern Elf_Brandnote __elfN(kfreebsd_brandnote);
  #endif /* _KERNEL */
  
  #endif /* !_SYS_IMGACT_ELF_H_ */
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/135468: commit references a PR
Date: Thu, 27 Aug 2009 17:37:11 +0000 (UTC)

 Author: bz
 Date: Thu Aug 27 17:36:59 2009
 New Revision: 196602
 URL: http://svn.freebsd.org/changeset/base/196602
 
 Log:
   MFC r196512:
   
     Fix handling of .note.ABI-tag section for GNU systems [1].
     Handle GNU/Linux according to LSB Core Specification 4.0,
     Chapter 11. Object Format, 11.8. ABI note tag.
   
     Also check the first word of desc, not only name, according to
     glibc abi-tags specification to distinguish between Linux and
     kFreeBSD.
   
     Add explicit handling for Debian GNU/kFreeBSD, which runs
     on our kernels as well [2].
   
     In {amd64,i386}/trap.c, when checking osrel of the current process,
     also check the ABI to not change the signal behaviour for Linux
     binary processes, now that we save an osrel version for all three
     from the lists above in struct proc [2] (slightly different to HEAD).
   
     These changes make it possible to run FreeBSD, Debian GNU/kFreeBSD
     and Linux binaries on the same machine again for at least i386 and
     amd64, and no longer break kFreeBSD which was detected as GNU(/Linux).
   
   PR:		kern/135468
   Submitted by:	dchagin [1] (initial patch)
   Suggested by:	kib [2]
   Tested by:	Petr Salinger (Petr.Salinger seznam.cz) for kFreeBSD
   Reviewed by:	kib
 
 Modified:
   stable/7/sys/   (props changed)
   stable/7/sys/amd64/amd64/elf_machdep.c
   stable/7/sys/amd64/amd64/trap.c
   stable/7/sys/amd64/linux32/linux32_sysvec.c
   stable/7/sys/compat/ia32/ia32_sysvec.c
   stable/7/sys/conf/   (props changed)
   stable/7/sys/contrib/pf/   (props changed)
   stable/7/sys/i386/i386/elf_machdep.c
   stable/7/sys/i386/i386/trap.c
   stable/7/sys/i386/linux/linux_sysvec.c
   stable/7/sys/kern/imgact_elf.c
   stable/7/sys/sys/imgact_elf.h
 
 Modified: stable/7/sys/amd64/amd64/elf_machdep.c
 ==============================================================================
 --- stable/7/sys/amd64/amd64/elf_machdep.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/amd64/amd64/elf_machdep.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
  #include <sys/sysent.h>
  #include <sys/imgact_elf.h>
  #include <sys/syscall.h>
 +#include <sys/sysent.h>
  #include <sys/signalvar.h>
  #include <sys/vnode.h>
  
 @@ -107,6 +108,22 @@ SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf64_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf64_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_X86_64,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld-kfreebsd-x86-64.so.1",
 +	.sysvec		= &elf64_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf64_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf64_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf64_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/7/sys/amd64/amd64/trap.c
 ==============================================================================
 --- stable/7/sys/amd64/amd64/trap.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/amd64/amd64/trap.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
   */
  
  #include "opt_clock.h"
 +#include "opt_compat.h"
  #include "opt_cpu.h"
  #include "opt_hwpmc_hooks.h"
  #include "opt_isa.h"
 @@ -115,6 +116,13 @@ dtrace_doubletrap_func_t	dtrace_doubletr
  systrace_probe_func_t	systrace_probe_func;
  #endif
  
 +/* Defined in amd64/amd64/elf_machdep.c. */
 +extern struct sysentvec elf64_freebsd_sysvec;
 +#ifdef COMPAT_IA32
 +/* Defined in compat/ia32/ia32_sysvec.c. */
 +extern struct sysentvec ia32_freebsd_sysvec;
 +#endif
 +
  extern void trap(struct trapframe *frame);
  extern void syscall(struct trapframe *frame);
  void dblfault_handler(struct trapframe *frame);
 @@ -359,7 +367,13 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if ((curproc->p_sysent ==
 +					    &elf64_freebsd_sysvec
 +#ifdef COMPAT_IA32
 +					    || curproc->p_sysent ==
 +					    &ia32_freebsd_sysvec
 +#endif
 +					    ) && p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: stable/7/sys/amd64/linux32/linux32_sysvec.c
 ==============================================================================
 --- stable/7/sys/amd64/linux32/linux32_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/amd64/linux32/linux32_sysvec.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -126,6 +126,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static void	linux32_fixlimit(struct rlimit *rl, int which);
 +static boolean_t linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static eventhandler_tag linux_exit_tag;
  static eventhandler_tag linux_schedtail_tag;
 @@ -1055,14 +1056,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_maxssiz	= &linux32_maxssiz,
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux32_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux32_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux32_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: stable/7/sys/compat/ia32/ia32_sysvec.c
 ==============================================================================
 --- stable/7/sys/compat/ia32/ia32_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/compat/ia32/ia32_sysvec.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -171,6 +171,21 @@ SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&ia32_brand_oinfo);
  
 +static Elf32_Brandinfo kia32_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &ia32_freebsd_sysvec,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kia32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kia32_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/7/sys/i386/i386/elf_machdep.c
 ==============================================================================
 --- stable/7/sys/i386/i386/elf_machdep.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/i386/i386/elf_machdep.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -107,6 +107,22 @@ SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_AN
  	(sysinit_cfunc_t) elf32_insert_brand_entry,
  	&freebsd_brand_oinfo);
  
 +static Elf32_Brandinfo kfreebsd_brand_info = {
 +	.brand		= ELFOSABI_FREEBSD,
 +	.machine	= EM_386,
 +	.compat_3_brand	= "FreeBSD",
 +	.emul_path	= NULL,
 +	.interp_path	= "/lib/ld.so.1",
 +	.sysvec		= &elf32_freebsd_sysvec,
 +	.interp_newpath	= NULL,
 +	.brand_note	= &elf32_kfreebsd_brandnote,
 +	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 +};
 +
 +SYSINIT(kelf32, SI_SUB_EXEC, SI_ORDER_ANY,
 +	(sysinit_cfunc_t) elf32_insert_brand_entry,
 +	&kfreebsd_brand_info);
 +
  
  void
  elf32_dump_thread(struct thread *td __unused, void *dst __unused,
 
 Modified: stable/7/sys/i386/i386/trap.c
 ==============================================================================
 --- stable/7/sys/i386/i386/trap.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/i386/i386/trap.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -123,6 +123,9 @@ dtrace_doubletrap_func_t	dtrace_doubletr
  systrace_probe_func_t	systrace_probe_func;
  #endif
  
 +/* Defined in i386/i386/elf_machdep.c. */
 +extern struct sysentvec elf32_freebsd_sysvec;
 +
  extern void trap(struct trapframe *frame);
  extern void syscall(struct trapframe *frame);
  
 @@ -423,7 +426,9 @@ trap(struct trapframe *frame)
  					 * This check also covers the images
  					 * without the ABI-tag ELF note.
  					 */
 -					if (p->p_osrel >= 700004) {
 +					if (curproc->p_sysent ==
 +					    &elf32_freebsd_sysvec &&
 +					    p->p_osrel >= 700004) {
  						i = SIGSEGV;
  						ucode = SEGV_ACCERR;
  					} else {
 
 Modified: stable/7/sys/i386/linux/linux_sysvec.c
 ==============================================================================
 --- stable/7/sys/i386/linux/linux_sysvec.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/i386/linux/linux_sysvec.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -107,6 +107,7 @@ static void     linux_sendsig(sig_t catc
  static void	exec_linux_setregs(struct thread *td, u_long entry,
  				   u_long stack, u_long ps_strings);
  static register_t *linux_copyout_strings(struct image_params *imgp);
 +static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
  
  static int linux_szplatform;
  const char *linux_platform;
 @@ -1025,14 +1026,38 @@ struct sysentvec elf_linux_sysvec = {
  	.sv_maxssiz	= NULL
  };
  
 -static char GNULINUX_ABI_VENDOR[] = "GNU";
 +static char GNU_ABI_VENDOR[] = "GNU";
 +static int GNULINUX_ABI_DESC = 0;
 +
 +static boolean_t
 +linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNULINUX_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * For linux we encode osrel as follows (see linux_mib.c):
 +	 * VVVMMMIII (version, major, minor), see linux_mib.c.
 +	 */
 +	*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
  
  static Elf_Brandnote linux_brandnote = {
 -	.hdr.n_namesz	= sizeof(GNULINUX_ABI_VENDOR),
 -	.hdr.n_descsz	= 16,
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
  	.hdr.n_type	= 1,
 -	.vendor		= GNULINUX_ABI_VENDOR,
 -	.flags		= 0
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= linux_trans_osrel
  };
  
  static Elf32_Brandinfo linux_brand = {
 
 Modified: stable/7/sys/kern/imgact_elf.c
 ==============================================================================
 --- stable/7/sys/kern/imgact_elf.c	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/kern/imgact_elf.c	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -86,6 +86,9 @@ static int __elfN(load_section)(struct v
      vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz,
      vm_prot_t prot, size_t pagesize);
  static int __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp);
 +static boolean_t __elfN(freebsd_trans_osrel)(const Elf_Note *note,
 +    int32_t *osrel);
 +static boolean_t kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel);
  static boolean_t __elfN(check_note)(struct image_params *imgp,
      Elf_Brandnote *checknote, int32_t *osrel);
  
 @@ -119,9 +122,56 @@ Elf_Brandnote __elfN(freebsd_brandnote) 
  	.hdr.n_descsz	= sizeof(int32_t),
  	.hdr.n_type	= 1,
  	.vendor		= FREEBSD_ABI_VENDOR,
 -	.flags		= BN_CAN_FETCH_OSREL
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= __elfN(freebsd_trans_osrel)
  };
  
 +static boolean_t
 +__elfN(freebsd_trans_osrel)(const Elf_Note *note, int32_t *osrel)
 +{
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +	*osrel = *(const int32_t *)(p);
 +
 +	return (TRUE);
 +}
 +
 +static const char GNU_ABI_VENDOR[] = "GNU";
 +static int GNU_KFREEBSD_ABI_DESC = 3;
 +
 +Elf_Brandnote __elfN(kfreebsd_brandnote) = {
 +	.hdr.n_namesz	= sizeof(GNU_ABI_VENDOR),
 +	.hdr.n_descsz	= 16,	/* XXX at least 16 */
 +	.hdr.n_type	= 1,
 +	.vendor		= GNU_ABI_VENDOR,
 +	.flags		= BN_TRANSLATE_OSREL,
 +	.trans_osrel	= kfreebsd_trans_osrel
 +};
 +
 +static boolean_t
 +kfreebsd_trans_osrel(const Elf_Note *note, int32_t *osrel)
 +{
 +	const Elf32_Word *desc;
 +	uintptr_t p;
 +
 +	p = (uintptr_t)(note + 1);
 +	p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
 +
 +	desc = (const Elf32_Word *)p;
 +	if (desc[0] != GNU_KFREEBSD_ABI_DESC)
 +		return (FALSE);
 +
 +	/*
 +	 * Debian GNU/kFreeBSD embed the earliest compatible kernel version
 +	 * (__FreeBSD_version: <major><two digit minor>Rxx) in the LSB way.
 +	 */
 +	*osrel = desc[1] * 100000 + desc[2] * 1000 + desc[3];
 +
 +	return (TRUE);
 +}
 +
  int
  __elfN(insert_brand_entry)(Elf_Brandinfo *entry)
  {
 @@ -1382,11 +1432,9 @@ __elfN(check_note)(struct image_params *
  		 * Fetch the osreldate for binary
  		 * from the ELF OSABI-note if necessary.
  		 */
 -		if ((checknote->flags & BN_CAN_FETCH_OSREL) != 0 &&
 -		    osrel != NULL)
 -			*osrel = *(const int32_t *) (note_name +
 -			    roundup2(checknote->hdr.n_namesz,
 -			    sizeof(Elf32_Addr)));
 +		if ((checknote->flags & BN_TRANSLATE_OSREL) != 0 &&
 +		    checknote->trans_osrel != NULL)
 +			return (checknote->trans_osrel(note, osrel));
  		return (TRUE);
  
  nextnote:
 
 Modified: stable/7/sys/sys/imgact_elf.h
 ==============================================================================
 --- stable/7/sys/sys/imgact_elf.h	Thu Aug 27 17:34:13 2009	(r196601)
 +++ stable/7/sys/sys/imgact_elf.h	Thu Aug 27 17:36:59 2009	(r196602)
 @@ -59,7 +59,10 @@ typedef struct {
  	Elf_Note	hdr;
  	const char *	vendor;
  	int		flags;
 -#define	BN_CAN_FETCH_OSREL	0x0001
 +	boolean_t	(*trans_osrel)(const Elf_Note *, int32_t *);
 +#define	BN_CAN_FETCH_OSREL	0x0001	/* Deprecated. */
 +#define	BN_TRANSLATE_OSREL	0x0002	/* Use trans_osrel fetch osrel after */
 +					/* checking ABI contraint if needed. */
  } Elf_Brandnote;
  
  typedef struct {
 @@ -92,6 +95,7 @@ void	__elfN(dump_thread)(struct thread *
  
  extern	int __elfN(fallback_brand);
  extern Elf_Brandnote __elfN(freebsd_brandnote);
 +extern Elf_Brandnote __elfN(kfreebsd_brandnote);
  #endif /* _KERNEL */
  
  #endif /* !_SYS_IMGACT_ELF_H_ */
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: bz 
State-Changed-When: Thu Aug 27 22:34:53 UTC 2009 
State-Changed-Why:  
All MFCed dow to stable/7. 
Thanks for reporting, the initial patch, and testing. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=135468 
>Unformatted:
