From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1Tybb2-0001n7-QP for mharc-grub-devel@gnu.org; Fri, 25 Jan 2013 00:13:00 -0500 Received: from eggs.gnu.org ([208.118.235.92]:43836) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tybau-0001mN-1d for grub-devel@gnu.org; Fri, 25 Jan 2013 00:12:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tybam-0006yg-OI for grub-devel@gnu.org; Fri, 25 Jan 2013 00:12:51 -0500 Received: from the.earth.li ([46.43.34.31]:41874) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tybam-0006yU-Eq for grub-devel@gnu.org; Fri, 25 Jan 2013 00:12:44 -0500 Received: from noodles by the.earth.li with local (Exim 4.72) (envelope-from ) id 1Tybaj-0002Vf-Ty for grub-devel@gnu.org; Fri, 25 Jan 2013 05:12:41 +0000 Date: Thu, 24 Jan 2013 21:12:41 -0800 From: Jonathan McDowell To: The development of GNU GRUB Subject: Re: [PATCH] Add testpci command (v4) Message-ID: <20130125051241.GP27908@earth.li> References: <20120927214211.GS2289@earth.li> <20121011002145.GV2289@earth.li> <20121012221805.GB2289@earth.li> <50FC6F50.9040507@gmail.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="Y7xTucakfITjPcLV" Content-Disposition: inline In-Reply-To: <50FC6F50.9040507@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 46.43.34.31 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Jan 2013 05:12:59 -0000 --Y7xTucakfITjPcLV Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Jan 20, 2013 at 11:27:28PM +0100, Vladimir '=CF=86-coder/phcoder' Serbinenko wrote: > On 13.10.2012 00:18, Jonathan McDowell wrote: (some code) > ARG_TYPE_INT means that the argument is decimal integer but it's not the > case here. > Please follow indent style. > You need to check grub_errno to catch any error in number parsing. > Also you need to update a little bit because of recent callback changes. > Other than this the patch is fine. Ok, I've updated against latest bzr and made the changes as above. Here's v4. Signed-off-by: Jonathan McDowell ----- =3D=3D=3D modified file 'docs/grub.texi' --- docs/grub.texi 2013-01-21 16:53:41 +0000 +++ docs/grub.texi 2013-01-23 01:35:32 +0000 @@ -3366,6 +3366,7 @@ * sendkey:: Emulate keystrokes * set:: Set an environment variable * source:: Read a configuration file in same context +* testpci:: Test for the existence of a PCI device * true:: Do nothing, successfully * unset:: Unset an environment variable * uppermem:: Set the upper memory size @@ -4147,6 +4148,18 @@ @end deffn =20 =20 +@node testpci +@subsection testpci + +@deffn Command testpci [@option{--vendor=3DVENDORID}] @ + [@option{--product=3DPRODUCTID}] [@option{--subvendor VENDORID}] @ + [@option{--subproduct PRODUCTID}] +Test for the existence of a given PCI device. Returns true if a device +matching the specified vendor/product and/or subvendor/subproduct informat= ion +is found. +@end deffn + + @node true @subsection true =20 =3D=3D=3D modified file 'grub-core/Makefile.core.def' --- grub-core/Makefile.core.def 2013-01-16 19:44:11 +0000 +++ grub-core/Makefile.core.def 2013-01-23 01:34:44 +0000 @@ -862,6 +862,12 @@ }; =20 module =3D { + name =3D testpci; + common =3D commands/testpci.c; + enable =3D pci; +}; + +module =3D { name =3D true; common =3D commands/true.c; }; =3D=3D=3D added file 'grub-core/commands/testpci.c' --- grub-core/commands/testpci.c 1970-01-01 00:00:00 +0000 +++ grub-core/commands/testpci.c 2013-01-23 22:21:11 +0000 @@ -0,0 +1,128 @@ +/* testpci.c - Test for PCI device existence. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +static const struct grub_arg_option options[] =3D + { + {"vendor", 'v' , 0, N_("PCI vendor ID to look for"), 0, ARG_TYPE_STRIN= G}, + {"product", 'p' , 0, N_("PCI product ID to look for"), 0, ARG_TYPE_STR= ING}, + {"subvendor", 's' , 0, N_("PCI subsystem vendor ID to look for"), 0, A= RG_TYPE_STRING}, + {"subproduct", 't' , 0, N_("PCI subsystem product ID to look for"), 0,= ARG_TYPE_STRING}, + {0, 0, 0, 0, 0, 0} + }; + +static grub_uint32_t pcimask, pcisubmask; +static grub_pci_id_t pcisearch; +static grub_pci_id_t pcisubsearch; + +static int +grub_testpci_iter (grub_pci_device_t dev __attribute__ ((unused)), + grub_pci_id_t pciid, + void *data) +{ + grub_pci_address_t addr; + grub_uint32_t subsystem; + int *found =3D data; + + if ((pciid & pcimask) !=3D pcisearch) { + return 0; + } + + if (pcisubmask !=3D 0) { + addr =3D grub_pci_make_address (dev, GRUB_PCI_REG_SUBVENDOR); + subsystem =3D grub_pci_read (addr); + if ((subsystem & pcisubmask) !=3D pcisubsearch) { + return 0; + } + } + + *found =3D 1; + return 1; +} + +static grub_err_t +grub_cmd_testpci (grub_extcmd_context_t ctxt, + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) +{ + struct grub_arg_list *state =3D ctxt->state; + int found =3D 0; + + pcimask =3D pcisubmask =3D pcisearch =3D pcisubsearch =3D 0; + + if (state[0].set) { + pcisearch |=3D grub_strtoull (state[0].arg, 0, 16); + if (grub_errno !=3D GRUB_ERR_NONE) { + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Couldn't parse PCI ven= dor ID")); + } + pcimask |=3D 0xFFFF; + } + + if (state[1].set) { + pcisearch |=3D (grub_strtoull (state[1].arg, 0, 16) << 16); + if (grub_errno !=3D GRUB_ERR_NONE) { + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Couldn't parse PCI pro= duct ID")); + } + pcimask |=3D 0xFFFF0000; + } + + if (state[2].set) { + pcisubsearch |=3D grub_strtoull (state[2].arg, 0, 16); + if (grub_errno !=3D GRUB_ERR_NONE) { + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Couldn't parse PCI sub= system vendor ID")); + } + pcisubmask |=3D 0xFFFF; + } + + if (state[3].set) { + pcisubsearch |=3D (grub_strtoull (state[3].arg, 0, 16) << 16); + if (grub_errno !=3D GRUB_ERR_NONE) { + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Couldn't parse PCI sub= system product ID")); + } + pcisubmask |=3D 0xFFFF0000; + } + + grub_pci_iterate (grub_testpci_iter, &found); + + return found ? GRUB_ERR_NONE : grub_error (GRUB_ERR_TEST_FAILURE, "false= "); +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(testpci) +{ + cmd =3D grub_register_extcmd ("testpci", grub_cmd_testpci, 0, + N_("[--vendor=3DVENDORID] [--product=3DPRODUCTID] " + "[--subvendor=3DVENDORID] " + "[--subproduct=3DPRODUCTID]"), + N_("Test for PCI device existence."), + options); +} + +GRUB_MOD_FINI(testpci) +{ + grub_unregister_extcmd (cmd); +} ----- J. --=20 "Basically, if you're allowed to own it, you're probably allowed to burn it." -- Stephen Gower, ox.general --Y7xTucakfITjPcLV Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAEBCAAGBQJRAhRJAAoJEP8WL8XPP7rRtKsP/jubezexP4PNc6VDQSYyYjD+ GUDQ6W84rFJu3UhoWUFBBBCHHyw9d/bBzzi/52kVmskrMw/KxP8pEe+fz70//4rq rlIlgCWvgvL3c32cHQrBlBIk1eiNKby9Go1j/u+kqa+bDE03XHyY6yy6pWKQ7wuO 1Kx0EPYSarLSE5Ds1q8vdoljdQgBBq/B/aZb579HHC5a4W635ZtkSid+RPNuSylO kxjdTdHoJzw73FW9XUCd1DjBSXMhSp5QCbDfYeCtbhpIv8mis6mgWrcp1+EwgSWL Viv52Xm4OIjwXK8r3uKmf2jHp5PO4iJmmYP3cER0RPIHORKjGM1nszqtgSBj1gK/ upgWPD/D1COu0r1Bgs9wlNXq/MESzwQaAqp+I1wpZUSlGWV7kuymIros3/Y16wgV n1glHfh4SlAlORo0VzhDv5r4hwZAjgWtlhT2pFR3ikWml5TzJkX1QHAlQxoeNL7Z fUiWJ4lgdfi6uqrMGzJ4OGYuMBWOGhUMaxkBwS4vRgEen5BB3/dLxaYKJ8Be1d6U K49dAYnf2dccpKRerECkTYCkrMS+FJPgYIamfHFVwd4me1zj9WyXwUbaH/ROYHF6 TAkxl4s5W8lj7M15v76qA1o+yhY2cDoTJq+kPD+0HksDaxRqjoWMmhEUdHJtx8K5 zdtgmocVpi54pwhPBxn8 =wf4i -----END PGP SIGNATURE----- --Y7xTucakfITjPcLV--