Import Upstream version 2.3.1
This commit is contained in:
commit
76aace8615
|
@ -0,0 +1,6 @@
|
|||
Main author:
|
||||
* Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||
|
||||
Based on previous work by:
|
||||
* Simon Trimmer
|
||||
* Tigran Aivazian
|
|
@ -0,0 +1,30 @@
|
|||
Contributing to iucode_tool development
|
||||
---------------------------------------
|
||||
|
||||
Contributions in the form of patches or merge requests, and bug/issue
|
||||
reports (especially when they are detailed) are welcome.
|
||||
|
||||
Please report issues and bugs (with or without proposed patches) and
|
||||
request new features through the gitlab interface:
|
||||
|
||||
https://gitlab.com/iucode-tool/iucode-tool/issues
|
||||
|
||||
Merge requests (aka pull requests) should be made through the gitlab web
|
||||
interface. Note that I am perfectly happy to also take patches over
|
||||
email or as attachments to issue reports.
|
||||
|
||||
|
||||
Reporting security issues:
|
||||
|
||||
iucode_tool is not particularly security-sensitive, but if you need to
|
||||
contact me about a security issue that should not be made public before
|
||||
a fix is widely deployed, you have two options:
|
||||
|
||||
1. Contact me through GnuPG encrypted email (key fingerprint/key id
|
||||
0xC467A717507BBAFED3C160920BD9E81139CB4807).
|
||||
|
||||
2. Alternatively, please contact the Debian security team[1]. They will
|
||||
forward the issue to me, and they can independently coordinate with
|
||||
vendor-sec and the other Linux distros as required.
|
||||
|
||||
[1] https://www.debian.org/security/faq#contact
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
|
@ -0,0 +1,677 @@
|
|||
2018-02-05, iucode_tool v2.3.1
|
||||
* iucode_tool: fix filter by revision parser on ILP32
|
||||
|
||||
2018-01-28, iucode_tool v2.3
|
||||
|
||||
* iucode_tool(8): document changes to ucode filtering
|
||||
* iucode_tool: support selecting by ucode revision
|
||||
Add a third (and optional) parameter to microcode selection filters, to
|
||||
select microcodes by revision. The revision can be prefixed by the
|
||||
operators eq: (equal to), lt: (less than), or gt: (greater than).
|
||||
The revision numbering is signed, but in order to be more user friendly,
|
||||
since we display revisions as unsigned values in hex, we accept the
|
||||
range -INT32_MAX to +UINT32_MAX, and convert it to int32_t.
|
||||
* iucode_tool: add function to parse signed 32-bit integers
|
||||
Add parse_s32e(), based on parse_u32(). It will be used to parse
|
||||
microcode revisions in the command line, so it has an extension
|
||||
that accepts something like 0xfffffffe as an alias for -2.
|
||||
* iucode_tool: optimize detection of base10 numeric names
|
||||
* iucode_tool: better handle offline/non-continuous topology
|
||||
* iucode_tool(8): document changes to --scan-system
|
||||
* iucode_tool: select scan-system strategy change at runtime
|
||||
Instead of selecting the scan-system strategy at compile time, enhance the
|
||||
long-version of the --scan-system option to take an optional argument, and
|
||||
select the strategy. Available strategies are: 0 (auto), 1 (fast), and 2
|
||||
(exact). Fast uses just the cpuid instruction and activates all steppings.
|
||||
Exact will query all processors using the kernel cpuid driver. Auto (the
|
||||
default) is currently the same as fast. The short option -S is equivalent
|
||||
to --scan-system=auto. This way, we don't break backwards command line
|
||||
behavior, and something like "iucode_tool -Sl" will still work. In
|
||||
--scan-system=exact mode, when a /dev/cpu/#/cpuid scan fails, it will use
|
||||
the result from the cpuid instruction and also add every other stepping for
|
||||
any signatures found before the failure.
|
||||
* gitignore: rearrange, and ignore backup and vim swap files
|
||||
* iucode_tool: move scan_system_processor() one layer down
|
||||
* iucode_tool: do not scan-system while parsing
|
||||
Instead of processing -s and -S/--scan-system while parsing, queue all
|
||||
filters so that we can call scan_system_processors() later. This was the
|
||||
only complex operation that was being carried out while parsing the command
|
||||
line. This change ensures that global options such as -q and -v, that are
|
||||
not supposed to be sensitive to their position in the command line, will
|
||||
work as expected.
|
||||
* iucode_tool: add two command-line parser helpers
|
||||
* intel_microcode.h: document intel_ucode_status_t sources
|
||||
* update copyright dates to 2018
|
||||
|
||||
2017-08-28, iucode_tool v2.2
|
||||
|
||||
* README: update for mixed dat and bin Intel releases
|
||||
* configure: fix handling of --without-foo/--disable-bar
|
||||
* intel_microcode: fast-track intel_ucode_compare(a, a)
|
||||
* iucode_tool: fix microcode count when selecting extended signatures
|
||||
* iucode_tool: rename and document some xx_xtsdeduplist* functions
|
||||
* configure: support libargp as an alternative to glibc argp
|
||||
* intel_microcode: do not request inlining for is_zero_checksum()
|
||||
* iucode_tool: use fprintf(stdout) instead of printf()
|
||||
* intel_microcode: declare intel_ucode_errstr() as const
|
||||
* iucode_tool: ensure printf %x args are unsigned
|
||||
* README: add an example of microcode with multiple sigs
|
||||
* configure: add --enable-extend-flags to change default build flags
|
||||
Add a way to not completely override the C/CPP/LDFLAGS configure.ac
|
||||
would like to set.
|
||||
* configure: default build to hardened -O3 PIE with lots of warnings
|
||||
Override the autoconf default CFLAGS, CPPFLAGS and LDFLAGS for a more
|
||||
optimized, hardened build by default. Also, print the value of these
|
||||
variables in configure output. The standard methods to override the
|
||||
default CFLAGS, CPPFLAGS and LDFLAGS in configure still work, and will
|
||||
bypass the new defaults. Linux distros that override these on every build
|
||||
should not see any changes. Should the compiler not be detected as
|
||||
gcc-compatible, no change to CFLAGS/CPPFLAGS/LDFLAGS will be made. Note
|
||||
that clang is explicitly supported, and works just fine. The build will
|
||||
default to a baseline of "-O3 -g" and will attempt to selectively enable
|
||||
several warning options, and several hardening options. configure will
|
||||
attempt to detect the set of compiler and linker driver flags that would
|
||||
work. Caveats: autoconf 2.69 and automake 1.13 or later are now
|
||||
required.
|
||||
* configure: whitespace fixes and minor cosmetic fixes
|
||||
|
||||
2017-02-15, iucode_tool v2.1.2
|
||||
|
||||
* iucode_tool: compare payloads of similar (not just duplicate) MCUs
|
||||
Within the same signature, if two microcodes have the same revision,
|
||||
and can be installed on the same processor, their payload contents
|
||||
ought to be the same. However, we would only compare the payloads of
|
||||
microcodes with the exactly same processor flags mask, which is not
|
||||
enough. Fix it. Note: this issue not present in Intel-issued
|
||||
microcode seen in the field.
|
||||
* iucode_tool: skip small files as if empty in the -tr loader
|
||||
Make the recovery loader behave the same for empty files and files
|
||||
that are too small to contain any microcode: report that there were no
|
||||
microcodes found in the file, and skip the file.
|
||||
* intel-microcode: validade xx_intel_ucode_check_uc() parameters
|
||||
* iucode_tool: silence a harmless -Wmissing-field-initializers warning
|
||||
|
||||
2017-01-11, iucode_tool v2.1.1
|
||||
|
||||
* intel_microcode, iucode_tool: enhance microcode scan API
|
||||
* intel_microcode: harden intel_ucode_scan_for_microcode()
|
||||
* intel_microcode, iucode_tool: no more magic 1024 constants
|
||||
* intel_microcode: forbid unknown buffer sizes in
|
||||
intel_ucode_check_microcode()
|
||||
* intel_microcode, iucode_tool: track buffer sizes when iterating
|
||||
* intel_microcode: fix heap buffer overflow on -tr loader
|
||||
(CVE-2017-0357)
|
||||
When the last microcode region ends at exactly the end of the data
|
||||
file, intel_ucode_scan_for_microcode() would read data past the end of
|
||||
the memory buffer. This is usually harmless. Unfortunately, should
|
||||
there be a valid microcode exactly after the memory buffer,
|
||||
iucode_tool will misbehave *badly*. It is extremely unlikely that the
|
||||
harmful misbehavior could be triggered by accident -- at least when
|
||||
iucode_tool is linked to glibc -- due to glibc's memory allocator
|
||||
implementation details. Also, it is not believed to be possible for
|
||||
this bug to trigger in a harmful manner when only one datafile is
|
||||
being processed. However, it might be possible for an attacker to
|
||||
trigger the issue using a number of specially crafted data files, and
|
||||
it might also require tricking the user into using a specially crafted
|
||||
command line. Should the worst happen, iucode_tool may be convinced
|
||||
to corrupt its heap, and possibly the libc's heap control data
|
||||
structures, which could result in code execution, depending on the
|
||||
libc's internals. The harmless version of this bug is trivially
|
||||
triggered by using the -tr (recovery) loader on any file that ends
|
||||
with a valid microcode, such as any file that only contains valid
|
||||
microcode. This issue was detected by gcc's address sanitizer.
|
||||
* update copyright dates to 2017
|
||||
* spelling fixes to comments, messages and docs
|
||||
|
||||
2016-11-10, iucode_tool v2.1
|
||||
|
||||
* iucode_tool: alternative bug workaround for the early initramfs
|
||||
Implement a less hackish workaround to ensure the microcode file data
|
||||
will be aligned to a 16-byte boundary from the start of the early
|
||||
initramfs: instead of extending the microcode data filename with NULs,
|
||||
add a suitably sized empty directory entry to the initramfs cpio
|
||||
archive right before it (an empty file entry, or a hardlink entry
|
||||
would also have worked). We control the size of this "padding" entry
|
||||
by the length of its name, without any embedded NULs hacks. The
|
||||
increase in cpio metadata size caused by an extra cpio member header
|
||||
entry is always going to be absorbed by the padding at the end of the
|
||||
cpio archive at a 512 byte or 1024 byte block size: the file size of
|
||||
the resulting early initramfs is not changed. For --mini-earlyfs
|
||||
mode, which is tailored to what the kernel cares about and minimal
|
||||
size, we use the older workaround which results in a smaller archive
|
||||
at a 16-byte block size.
|
||||
* iucode_tool: cosmetic error path cleanup for write_cpio_header()
|
||||
* iucode_tool(8): document --mini-earlyfw and --normal-earlyfw
|
||||
* iucode_tool: add command line option to minimize early initramfs size
|
||||
A minimized early initramfs has a block size of 16 bytes, and doesn't
|
||||
contain parent directories.
|
||||
* iucode_tool: prepare for early-initramfs size minimization
|
||||
Enhance the low-level cpio header/trailer output functions to take
|
||||
runtime parameters instead of compile-time constants for: cpio block
|
||||
size and whether to include parent directories. While at it, constify
|
||||
parameters on the changed functions where possible.
|
||||
* iucode_tool: xx_write_cpio_hdrentry can assume dword-alignment
|
||||
* iucode_tool: generate reproducible early initramfs
|
||||
Instead of embedding the current time in the early initramfs, use the
|
||||
latest date found among the microcodes that are going to be included
|
||||
in that initramfs. While at it, fix an year 2038 issue which would
|
||||
result in a corrupted initramfs cpio archive. The microcode ordering
|
||||
inside the initramfs was already stabilized by iucode_tool release
|
||||
v2.0. This change is a contribution to the Reproducible Builds effort
|
||||
captained by the Debian project.
|
||||
* Add new CONTRIBUTING text file:
|
||||
Add a CONTRIBUTING text file with some details about how to submit bug
|
||||
reports, report security issues, and request new features.
|
||||
* Makefile.am: ship CONTRIBUTING in the tarball
|
||||
* intel_microcode: add intel_ucode_getdate_bcd() function
|
||||
* intel_microcode: move is_valid_bcd() earlier in the file
|
||||
* README: remove feeds as means to get latest microcode
|
||||
Intel is not updating every processor model's download feeds with the
|
||||
latest microcode package anymore. Do not suggest using them to locate
|
||||
the latest microcode data pack anymore.
|
||||
* configure, iucode_tool: define bug report address
|
||||
* intel_microcode: constify and restyle prototypes
|
||||
* iucode_tool: constify function parameters
|
||||
|
||||
2016-09-12, iucode_tool v2.0
|
||||
|
||||
* README: update for pf_mask change in output
|
||||
* ChangeLog: fix typos
|
||||
* iucode_tool(8): reduce usage of pf_mask in manpage
|
||||
* iucode_tool(8): document iucode-tool microcode ids
|
||||
* iucode_tool: don't str_append_ucode_id() on every microcode
|
||||
* iucode_tool: ensure IUCODE_MAX_MCU_FILE_SIZE is sane
|
||||
* iucode_tool: limit verbosity level to 5
|
||||
* iucode_tool: reorder malloc calls in load_intel_microcode_dat()
|
||||
* iucode_tool: increase first microcode data size guess to 2MiB
|
||||
* iucode_tool: fix -h help text for --scan-system
|
||||
* iucode_tool: limit cpio member size to 4GiB
|
||||
* iucode_tool(8): update for new -s/-S interaction
|
||||
Update manpage now that --scan-system can be overridden by -s !<sig>
|
||||
* iucode_tool: allow override of --scan-system results
|
||||
Process --scan-system in-line with -s, so that a later -s !<sig> can
|
||||
override signature filters added by --scan-system. To reproduce the
|
||||
earlier behavior, have --scan-system as the last option.
|
||||
* iucode_tool: complain of large sigs and masks for -s option
|
||||
Detect and report as an error (instead of silently truncating to
|
||||
32-bits) CPU signatures and processor flags masks in the command line
|
||||
when they are too large.
|
||||
* iucode_tool: retry on EINTR during writes
|
||||
Instead of aborting with an "interrupted system call" error during
|
||||
writes, retry the operation. This is already done for reads.
|
||||
* iucode_tool, intel_microcode: fix config.h include order
|
||||
The autoconf config header must be included before any C library
|
||||
headers, or it won't have the desired effects.
|
||||
This change activates large file support on 32-bit targets.
|
||||
* iucode_tool: support very large output files on 32bit
|
||||
* iucode_tool: use LFS-safe typecast for 32-bit
|
||||
* iucode_tool: add exception threshold to disable .dat fast parser
|
||||
If the fast-path parser fails too many times to handle the .dat file
|
||||
being processed, disable it for the remaining of that file.
|
||||
* iucode_tool: add fast-path to .dat loader
|
||||
Add a limited parser to the .dat loader, and use it as a fast path.
|
||||
This fast-path parser is capable of dealing with all currently
|
||||
released Intel .dat files ~40% faster than the better (strtoul-based)
|
||||
slow path. The fast-path defers to the slow path anything it cannot
|
||||
handle.
|
||||
* iucode_tool: use fgets_unlocked to parse .dat files
|
||||
* iucode_tool: detect large values in .dat files
|
||||
Detect as invalid any values that won't fit in 32 bits when parsing
|
||||
Intel .dat files, instead of silently truncating them to 32 bits.
|
||||
Note that these files would eventually fail to load for other reasons,
|
||||
such as invalid checksums.
|
||||
* iucode_tool: add helper to parse uint32_t values
|
||||
* iucode_tool: detect invalid NULs in .dat format loader
|
||||
Detect and reject files with embedded NULs when attempting to load
|
||||
using the text .dat format, since any NULs will cause everything after
|
||||
them in the same line to be discarded (due to the use of fgets() to
|
||||
parse the file). This effectively means every line must end with a
|
||||
newline ('\n') EOL marker, except for the last one in the data file.
|
||||
* intel_microcode: use the same type for internal microcode sizes
|
||||
* intel_microcode: don't drop const qualifiers from pointers
|
||||
* iucode_tool: use unsigned types for cpio header writing
|
||||
* iucode_tool: fix cosmetic issues in scan_and_pack_microcodes
|
||||
* intel_microcode: silence harmless sign-conversion
|
||||
* intel_microcode: remove undesired sign conversions
|
||||
* iucode_tool: avoid implicit promotion to signed in is_in_date_range()
|
||||
* iucode_tool: use defensive coding in load_intel_microcode_bin
|
||||
* iucode_tool: ensure fileno(stdin) did not fail
|
||||
Fixes: Coverity CID 163302 (false positive, failure requires broken
|
||||
libc/kernel)
|
||||
* iucode_tool: avoid signed bit constants
|
||||
* iucode_tool: (cosmetic comment fixes) it is errno, not errno()
|
||||
* iucode_tool: avoid conversions for constant line buffer size
|
||||
* iucode-tool: flush output files to permanent storage
|
||||
Use fdatasync() to flush output files to permanent storage before
|
||||
close(). For --write-named-to, --write-all-named-to, and
|
||||
--write-firmware, also fsync() the parent directory after all files
|
||||
have been written. These changes cause a severe performance
|
||||
degradation, but without them we cannot detect write errors on close,
|
||||
and that can end up corrupting a file important for system boot since
|
||||
the write error would be undetectable to a shell script.
|
||||
* configure.ac: default to dist-xz and enable warnings
|
||||
Enable automake warnings, and switch the "make dist" target to xz
|
||||
compression, as that's what is being used for the signed release
|
||||
tarballs.
|
||||
* configure.ac: update autotools minimum versions
|
||||
Update the minimum autoconf version to 2.69, and automake to 1.11.
|
||||
Older versions are not supported, and might or might not work.
|
||||
This is only relevant when not using the pre-built configure script
|
||||
shipped in the iucode_tool distribution tarballs.
|
||||
* iucode_tool: use print_warn() when we do not write to a file
|
||||
When there is nothing to output to a file, we don't touch it (i.e. we
|
||||
do not overwrite it with an empty result). Use print_warn() to report
|
||||
that to the user as a warning, instead of print_msg().
|
||||
* iucode_tool: fix minor issue on warning message
|
||||
* iucode_tool: widen bundle id output to three digits
|
||||
* iucode_tool: change pf mask to pf_mask on output
|
||||
* iucode_tool: indent selected microcode output
|
||||
Indent the selected microcode output (for --list) so that it matches
|
||||
the output of --list-all.
|
||||
* iucode_tool: change first column of --list output to gid/id
|
||||
Change the output format of --list output to use the gid/id notation
|
||||
(the same used by --list-all and also by any error messages and by
|
||||
most verbose debug or status messages) to identify the selected
|
||||
microcodes. This is vastly more useful than a monotonically
|
||||
increasing number that is not usable anywhere else.
|
||||
* iucode_tool: demote debug output about bundle assignment
|
||||
Now that we will output bundle assignment messages for --list (and not
|
||||
just --list-all), demote status/debug output about bundle assignment,
|
||||
so that it matches the same verbosity level of other messages from the
|
||||
same function. While at it, change the status message to better match
|
||||
what it means.
|
||||
* iucode_tool: output bundle assignment for --list-* when not quiet
|
||||
Output the bundle assignment headers already used for --list-all also
|
||||
for --list. Suppress that output for both --list-all and --list when
|
||||
in quiet mode.
|
||||
* iucode_tool(8): document new sorting order
|
||||
Microcode sorting order is now stabilized by a secondary key (pf_mask)
|
||||
* iucode_tool: refactor and improve uclist_merge_signature()
|
||||
Refactor uclist_merge_signature() into something much easier to
|
||||
understand. The refactored code sorts the uclist by cpuid (ascending
|
||||
order) and pf_mask (descending order), which stabilizes the sorting
|
||||
order. The pf_masks are sorted in descending order to ensure it will
|
||||
find supersets first as it walks the list. Downgrade mode is (still)
|
||||
limited by not being able to change pf_masks, so partially
|
||||
"superseded" (in the downgrade mode sense) entries will be left over
|
||||
in the selected microcode list when unavoidable.
|
||||
|
||||
2016-06-04, iucode_tool v1.6.1
|
||||
|
||||
* iucode_tool: append microcode bundles to linked list in O(1)
|
||||
* iucode_tool: stop allocating twice the required memory for a bundle
|
||||
* iucode_tool: don't close input files twice
|
||||
load_intel_microcode() would cause fds to be closed twice. iucode_tool
|
||||
is not multi-threaded and isn't otherwise affected by this bug, but
|
||||
unfortunately there is a free() call between the first and second
|
||||
close(). When running iucode_tool under some sort of malloc
|
||||
instrumentation insane enough to open file descriptors on free()
|
||||
inside the instrumented process' context, or indirectly linked to a
|
||||
multi-threaded glibc module/plugin that could do the same, bad things
|
||||
could happen.
|
||||
* iucode_tool(8): minor fix to a comment
|
||||
* iucode_tool(8): update Linux notes for up to v4.6
|
||||
* iucode_tool: constify argp parser information
|
||||
|
||||
2016-05-14, iucode_tool v1.6
|
||||
|
||||
* iucode_tool: fix failsafe for --enable-cpuid-device
|
||||
Further fixes for --scan-system when iucode_tool is compiled with the
|
||||
non-default configure/build-time option --enable-cpuid-device mode.
|
||||
Do not disable the failsafe mode when either /dev/cpu/*/cpuid cannot be
|
||||
opened, or an unexpected error happens during the cpuid scan. Note that
|
||||
we still consider the scan result valid when there are offline nodes.
|
||||
Also, adjust the error and status/debug messages so that proper feedback
|
||||
(through a warning) is given to the user when the scan fails.
|
||||
* iucode_tool: report out-of-memory error during cpuid scan
|
||||
* iucode_tool(8): document warning when downgrade mode fails
|
||||
* iucode_tool: warn of shadowed microcode in downgrade mode
|
||||
Warn when downgrading is impossible due to pf_mask shadowing: this
|
||||
happens when a pf_mask set loaded earlier has a higher microcode
|
||||
revision than a pf_mask subset loaded later for the same signature.
|
||||
* iucode_tool: introduce print_warn()
|
||||
Note: this changes the single "WARNING" in iucode_tool to "warning"
|
||||
* iucode_tool: don't snprintf just to printf something
|
||||
* iucode_tool: silence gcc warnings in -flto mode
|
||||
* iucode_tool: use pfm for pf_mask in structures
|
||||
* iucode_tool: fix another downgrade+loose date filter corner case
|
||||
Fix a corner case for the second pass of the loose date filter in
|
||||
downgrade mode: while late-merging an earlier microcode (in load order)
|
||||
whose pf_mask is either the same as, or a superset of, a later microcode
|
||||
(in load order) but with a same-or-higher revision, it would erroneously
|
||||
remove the later microcode (i.e. act as if download mode was not
|
||||
active).
|
||||
|
||||
2016-04-30, iucode_tool v1.5.2
|
||||
|
||||
* README: update technical details and correct two mistakes
|
||||
Mixed-stepping configurations are possible, and there was an off-by-one
|
||||
error in the platform flags mask table.
|
||||
* iucode_tool(8): fix manpage text for --scan-system
|
||||
Fix the iucode_tool(8) manpage text to not imply we will scan every
|
||||
processor in the system, as that depends on configure (compile-time)
|
||||
options, and it isn't the default behavior since version 1.2.
|
||||
* iucode_tool: don't assume single signature for multi-socket
|
||||
When not scanning every processor using the kernel cpuid device, add all
|
||||
possible steppings for the signature of the running processor.
|
||||
|
||||
2016-02-13, iucode_tool v1.5.1
|
||||
|
||||
* update copyright dates to 2016
|
||||
* iucode_tool: drop incorrect use of likely() in uclist_merge_signature()
|
||||
* iucode_tool(8): document downgrade mode limitations
|
||||
* iucode_tool: fix unimportant memory leaks for valgrind
|
||||
Fix two memory leaks at the program exit path for valgrind builds. This
|
||||
ensures "valgrind --leak-check=full --show-leak-kinds=all" output has no
|
||||
known false positives. For non-valgrind builds, we simply don't bother to
|
||||
free any heap memory in the exit path, as it would be just a waste of CPU
|
||||
cycles.
|
||||
* iucode_tool: look harder for superseded entries
|
||||
When we replace an entry that has the same pf_mask, it is necessary to
|
||||
look for entries that became obsolete. In non-downgrade mode, we might
|
||||
have skipped a few revisions, and might have merged microcode that is a
|
||||
proper subset, but has an intermediary revision between ours and the
|
||||
one we're replacing. In downgrade mode, the revision doesn't matter so
|
||||
it is even easier to have proper subset entries around that became
|
||||
obsolete.
|
||||
* iucode_tool: discard late outdated merge for loose date filter
|
||||
When in downgrade mode, during the second pass of the loose date
|
||||
filter, we would merge microcode that is a proper subset (and has the
|
||||
same revision) of already merged microcode. This is harmless, but it
|
||||
would waste space in the output. It is unlikely that this bug would
|
||||
ever happen with real microcode updates.
|
||||
* iucode_tool: fix downgrade mode when loose date-filtering
|
||||
Downgrade mode was broken for the loose mode of date filtering. Due to
|
||||
this bug, a microcode selected by the loose date filter might be
|
||||
preferred over one that was loaded later.
|
||||
* iucode_tool: fix infinite loop bug on non-disjoint pf_masks
|
||||
In the specific case where two microcodes for the same CPU signature
|
||||
had non-disjoint pf_masks, and neither pf_mask was contained in the
|
||||
other, the code would loop forever when it attempted to add the second
|
||||
microcode to the list of selected microcodes. Fortunately, Intel never
|
||||
published a public microcode update that could trigger this codepath.
|
||||
This issue exists in every released version of iucode_tool to date.
|
||||
* iucode_tool: cosmetic changes to load_intel_microcode()
|
||||
* iucode_tool: make uclist_add_signature() slightly faster
|
||||
Change uclist_add_signature() to stop looking for duplicates at the
|
||||
first match. This is slightly faster when processing several files
|
||||
with many duplicates, but it changes same-sig same-revision internal
|
||||
ordering from earliest first to latest first. This change to the
|
||||
sorting order only change the order in which do_write_named() will
|
||||
create the per-microcode data files. Also, trigger microcode opaque
|
||||
data comparison on the pointer to the duplicate being non-NULL, instead
|
||||
of testing for res == EEXIST. Note that this is not fixing an existing
|
||||
bug, the old code was correct.
|
||||
* iucode_tool: cosmetic fixes for uclist_add_signature()
|
||||
|
||||
2015-10-16, iucode_tool v1.5
|
||||
|
||||
* New --write-all-named-to option:
|
||||
+ iucode_tool(8): document the new --write-all-named-to option.
|
||||
+ iucode_tool: add a --write-all-named-to option, which works like
|
||||
--write-named-to, but instead of operating on selected microcode, it
|
||||
operates on every revision of every microcode. Exact duplicates are
|
||||
skipped, keyed on INTEL_UCLE_DUPSIG. This avoids the need to always
|
||||
enable --overwrite mode. This is the only way to write out every
|
||||
revision of a microcode.
|
||||
+ iucode_tool: add a new flag, INTEL_UCLE_DUPSIG, and use it to track
|
||||
duplicate signatures when they are added to all_microcodes. Only the
|
||||
first copy of that exact microcode (signature+pfm+revision) will not
|
||||
have INTEL_UCLE_DUPSIG set, in *load* order, regardless of downgrade
|
||||
mode.
|
||||
* intel_microcode.c: remove lots of unlikely() use, as the premise that
|
||||
it is most often called on valid microcode is no longer valid due to
|
||||
the recovery loader.
|
||||
* iucode_tool(8): fix parameter of --write-named-to. The manpage text
|
||||
was incorrectly naming the parameter of the option --write-named-to to
|
||||
be a file. It is a directory, as documented for the short version of
|
||||
the same option (-W).
|
||||
* iucode_tool(8): add two examples for the recovery loader (-tr): how to
|
||||
use it to load microcode from an early initramfs, and also how to use
|
||||
it to update an Arch-linux style separate early initramfs.
|
||||
* Changelog: correct the indentation of older Changelog entries.
|
||||
* Changelog: switch back to a "raw" changelog style. Writing user-level
|
||||
documentation is a much better use of time than simplifying Changelogs.
|
||||
|
||||
2015-10-03, iucode_tool v1.4
|
||||
|
||||
* Implement a microcode recover mode (-tr) for the binary loader,
|
||||
which searches for valid microcode(s) inside a generic (binary)
|
||||
data file of unknown format
|
||||
+ Do not store an empty microcode bundle for further processing,
|
||||
even if the low-level loader didn't return an error status (this
|
||||
is for future-proofing, currently all of them return errors)
|
||||
+ Report unaligned microcode as an internal error in the iterator
|
||||
functions as well as in intel_ucode_check_microcode(), but add
|
||||
a private function to allow for microcode checking without
|
||||
alignment restrictions
|
||||
+ Add intel_ucode_scan_for_microcode() to search for valid micro-
|
||||
code(s) inside a memory buffer, regardless of alignment
|
||||
+ Factor out microcode checksumming into is_zero_checksum(), and
|
||||
change it to avoid unaligned dword reads. This avoids a long
|
||||
time gcc -O3 loop vectorizing optimization issue which is still
|
||||
present in gcc 5.2.1
|
||||
* Notify the user when we fail to find any microcode in a data file
|
||||
when the low-level loader returns ENOENT, and continue processing
|
||||
in that case
|
||||
* Report empty data files using ENOENT instead of EINVAL in the
|
||||
low-level loader functions. This is can happen to non-empty files
|
||||
in the -tr and -td loaders, as well as when reading an empty file
|
||||
from stdin, FIFO, pipe, character device, etc.
|
||||
* In -vv mode, print a message before reading a file, and also when
|
||||
skipping empty files or reading a directory
|
||||
* Fix spelling of default-firmware-dir option in configure,
|
||||
thanks to Timo Gurr for the report and fix
|
||||
* Minor cosmetic fixes:
|
||||
+ Typo fix: replace "interator" with "iterator" everywhere
|
||||
+ Add comment about not closing a fd in fix_fds() should it
|
||||
be copied elsewhere, fix by Imran Zaman
|
||||
+ Add comment that one must not close(fd) after fdopendir(fd)
|
||||
succeeded. Both human programmers and static checkers get
|
||||
confused over this one and mistake it for leak
|
||||
* Replace "deselect" with "unselect" in the manpage text
|
||||
|
||||
2015-05-24, iucode_tool v1.3
|
||||
|
||||
* Reopen stdin/stdout/stderr file descriptors using /dev/null if any
|
||||
of them are closed at program start. Before this change, it was
|
||||
not safe to call iucode_tool with stdout and/or stderr closed
|
||||
* Ignore multiple attempts to read microcode data from stdin, as all
|
||||
data will have been read by the first attempt
|
||||
* Enforce a maximum of UINT_MAX data files. The number of microcodes
|
||||
per data file is also limited to UINT_MAX (actually, less than that
|
||||
due to other limits). Use "unsigned int" instead of "unsigned long
|
||||
int" for variables related to these (such as microcode group id and
|
||||
microcode id)
|
||||
* Document in the manpage the arbitrary maximum limit of 1GiB worth of
|
||||
binary data per microcode data file. The other limits are too large
|
||||
to bother documenting
|
||||
* Microcode data file loader fixes and enhancements:
|
||||
+ Detect and report stream IO errors while reading .dat files
|
||||
+ Detect and report IO errors from fdstat() at the beginning
|
||||
of the binary microcode loader
|
||||
+ Print the line number when reporting .dat parsing errors
|
||||
+ Allow comments after valid data for .dat files, previously they
|
||||
had to be on a line of their own
|
||||
+ Rework the .dat parser to make it less convoluted, and optimize it
|
||||
for the exact .dat file layout Intel has been using in the last 15
|
||||
years
|
||||
* Minor build fixes
|
||||
+ Silence unused parameter warning on --disable-cpuid-device build
|
||||
+ Silence unused function warning on --disable-valgrind-build build
|
||||
+ configure.ac: minor updates: add AC_COPYRIGHT; move AC_PREREQ
|
||||
before AC_INIT; remove commented-out AM_MAINTAINER_MODE
|
||||
* Reorder fields to pack some structs on 64 bits
|
||||
* Reorder some struct fields for better cache locality
|
||||
|
||||
2015-03-29, iucode_tool v1.2.1
|
||||
|
||||
* Update README and NEWS to mention the new project home
|
||||
location at GitLab, due to gitorious.org's planned shutdown
|
||||
at the end of 2015-05
|
||||
* Manpage fixes and enhancements:
|
||||
+ Minor typography/groff fixes
|
||||
+ Format long examples into multi-line format
|
||||
+ Add examples for --scan-system, -s and --write-earlyfw
|
||||
+ Minor changes to the other examples
|
||||
+ Document iucode_tool use of stdout and stderr
|
||||
+ Document that iucode_tool ignores the loader version microcode
|
||||
metadata field entirely
|
||||
+ Document the use of the "0x" and "0" prefixes to denote hexadecimal
|
||||
and octal bases for the signature and pf_mask parameters of the -s
|
||||
option
|
||||
* Flush stdout before writing to stderr. We want stdout/stderr output
|
||||
to be correctly interleaved when buffering is in effect due to stdout
|
||||
redirection
|
||||
* Flush stdout right after do_process_microcodes() is called, so that
|
||||
iucode_tool will output the result of --list and --list-all at that
|
||||
point in time
|
||||
* Minor argp parser fixes
|
||||
+ Don't include EOL in argp_error() strings
|
||||
+ Surround incorrect parameters with single quotes in parser error
|
||||
messages
|
||||
* Report internal errors (EINVAL) from uclist_add_signature() as
|
||||
such. While at it, cosmetic fix the same error message for
|
||||
uclist_merge_signature()
|
||||
|
||||
2015-02-14, iucode_tool v1.2
|
||||
|
||||
* Documentation updates:
|
||||
+ README: correct the /lib/firmware example to not remove execute
|
||||
permissions from the /lib/firmware/intel-ucode directory, and
|
||||
enhance the text to make it clear those are examples of fixing the
|
||||
permissions and may need to be adjusted
|
||||
+ README: enhance the README text and update it to the post-Haswell
|
||||
microcode update reality. Also, add a table of pf flags and
|
||||
masks, to make the text easier to understand and stop using tabs
|
||||
for the layout
|
||||
+ iucode_tool(8): update Linux notes to match reality as of kernel
|
||||
3.18. Also reword and improve the overall text
|
||||
* iucode_tool: use the cpuid instruction (via gcc's cpuid.h) directly
|
||||
to implement --scan-system. This assumes there is only one
|
||||
signature per x86/x86-64 system, which is a safe assumption at this
|
||||
time. One can have processors with distinct pf flags and the same
|
||||
signature in a x86/x86-64 multi-processor system, so --scan-system
|
||||
will match any pf_mask. When compile-time configured with
|
||||
--enable-cpuid-device (disabled by default), iucode-tool will use
|
||||
the cpuid instruction directly and also scan every processor using
|
||||
the kernel cpuid device. This fixes an scalability issue in systems
|
||||
with many processors
|
||||
|
||||
2014-10-28, iucode_tool v1.1.1
|
||||
|
||||
* Fix issues found by the Coverity static checker:
|
||||
+ CID 72165: An off-by-one error caused an out-of-bounds write to a
|
||||
buffer while loading large microcode data files in ASCII format
|
||||
(will not be triggered by the data files currently issued by Intel)
|
||||
+ CID 72163: The code could attempt to close an already closed file
|
||||
descriptor in certain conditions when processing directories
|
||||
+ CID 72161: Stop memory leak in error path when loading microcode
|
||||
data files
|
||||
+ CID 72159, 72164, 72166, 72167, 72168, 72169: Cosmetic issues
|
||||
that could not cause problems at runtime.
|
||||
|
||||
2014-09-09, iucode_tool v1.1
|
||||
|
||||
* Don't output duplicates for microcodes with extended signatures
|
||||
to the same file or to the kernel
|
||||
* When writing an early initramfs, pad its trailer with zeros to
|
||||
the next 1024-byte boundary. This is done so that the next
|
||||
initramfs segment will be better aligned, just in case. The
|
||||
entire cpio metadata overhead is now exactly 1024 bytes
|
||||
* Manpage style fixes: use iucode_tool consistently, groff formatting
|
||||
* Refuse to load ridiculously large data files (limit set to 1GiB)
|
||||
|
||||
2014-08-12, iucode_tool v1.0.3
|
||||
|
||||
* Add a work-around for a Linux kernel bug on the early initramfs
|
||||
microcode update support. The work-around appends non-standard NUL
|
||||
padding to the file name inside the cpio archive, so as to have the
|
||||
the microcode data 16-byte-aligned to the start of the file
|
||||
* Document file alignment requirements for the early initramfs
|
||||
archive.
|
||||
* Properly check microcode metadata date to be valid packed BCD in
|
||||
strict mode
|
||||
* Do not assume a non-zero microcode Total Size field to be valid, it
|
||||
is valid only when the Data Size field is non-zero. Fortunately,
|
||||
Intel always set reserved fields to zero on released microcode, so
|
||||
this bug was never (and is unlikely to ever be) triggered
|
||||
* Fix several cosmetic and minor code issues
|
||||
* minor corrections, enhancements and style fixes to the manpage
|
||||
|
||||
2014-05-10, iucode_tool v1.0.2
|
||||
|
||||
* Mention iucode-tool's new home at gitorious in documentation.
|
||||
* Warn user when --scan-system fails due to errors such as a lack
|
||||
of permission to access the cpuid devices
|
||||
* Use the libc optimized memcmp() to compare microcode
|
||||
* Minor manpage updates
|
||||
* --strict-checks now verifies that the microcode update date
|
||||
is not utterly insane
|
||||
|
||||
2013-12-14, iucode_tool v1.0.1
|
||||
|
||||
* Fix several cosmetic code issues
|
||||
* Manpage updates
|
||||
+ Make it clear that the output order of microcodes is not stabilized
|
||||
+ Make it clear that iucode_tool always break links when writing a
|
||||
data file, and that it doesn't replace files atomically, so they
|
||||
can get corrupted/lost if iucode-tool is interrupted while writing.
|
||||
+ Reword several notes for better readability
|
||||
* Use openat() when loading from a directory
|
||||
* Use openat() when creating files in a directory
|
||||
|
||||
2013-05-25, iucode_tool v1.0
|
||||
|
||||
* Add verbose title to manpage iucode_tool(8)
|
||||
* Add support to write an early initramfs archive for Linux v3.9.
|
||||
This early initramfs archive will need to be prepended to the
|
||||
regular initramfs to allow the kernel to load the microcode
|
||||
update
|
||||
|
||||
2013-03-28, iucode_tool v0.9
|
||||
|
||||
* Document missing -W, --write-named option in iucode_tool(8)
|
||||
manpage
|
||||
* Print the number of unique signatures in verbose mode
|
||||
* Add loose date-based filtering (--loose-date-filtering option),
|
||||
which is useful when trying to select microcode for very old
|
||||
processors
|
||||
* Skip empty files and directories instead of aborting with an
|
||||
error
|
||||
* Add an option to default to an empty selection (-s!)
|
||||
* Ensure that microcodes with the same metadata have the same
|
||||
opaque data (payload) when in --strict-checks mode (default)
|
||||
* Update copyright notices and manpage date
|
||||
|
||||
2012-08-26, iucode_tool v0.8.3
|
||||
|
||||
* Fix regression introduced in 0.8.2 that caused all microcodes
|
||||
to be selected by --scan-system on a box with unsupported
|
||||
processors (e.g. non-Intel)
|
||||
* Update README: Intel has some microcode update information in
|
||||
some public processor specification update documents
|
||||
|
||||
2012-07-28, iucode_tool v0.8.2
|
||||
|
||||
* Update documentation and manpages for the new microcode
|
||||
update interface in Linux v3.6.
|
||||
* Fail safe when --scan-system cannot access the cpuid driver:
|
||||
instead of not selecting anything, still select all microcodes
|
||||
if no other microcode selection option was used.
|
||||
* Move NEWS to ChangeLog
|
||||
|
||||
2012-07-24, iucode_tool v0.8.1
|
||||
|
||||
* Updates to the iucode_tool(8) manpage, disclosing the
|
||||
need for the cpuid driver for iucode_tool --scan-system,
|
||||
and more details about the sysfs microcode reload
|
||||
interface.
|
||||
* Output an error message if --scan-system could not find
|
||||
any cpuid nodes in sysfs.
|
||||
|
||||
2012-06-07, iucode_tool v0.8
|
||||
|
||||
* First release to the general public. Please refer to
|
||||
the README file for the irrelevant details, and to the
|
||||
manpage for the relevant details.
|
|
@ -0,0 +1,237 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
6. Often, you can also type `make uninstall' to remove the installed
|
||||
files again.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
##
|
||||
## Toplevel Makefile.am for iucode_tool
|
||||
##
|
||||
|
||||
sbin_PROGRAMS = iucode_tool
|
||||
man_MANS = iucode_tool.8
|
||||
|
||||
iucode_tool_SOURCES = intel_microcode.h intel_microcode.c iucode_tool.c
|
||||
EXTRA_DIST = autogen.sh CONTRIBUTING
|
||||
|
|
@ -0,0 +1,853 @@
|
|||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
sbin_PROGRAMS = iucode_tool$(EXEEXT)
|
||||
subdir = .
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \
|
||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_append_link_flags.m4 \
|
||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_require_defined.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||
$(am__configure_deps) $(am__DIST_COMMON)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = iucode_tool_config.h
|
||||
CONFIG_CLEAN_FILES = iucode_tool.8
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
|
||||
PROGRAMS = $(sbin_PROGRAMS)
|
||||
am_iucode_tool_OBJECTS = intel_microcode.$(OBJEXT) \
|
||||
iucode_tool.$(OBJEXT)
|
||||
iucode_tool_OBJECTS = $(am_iucode_tool_OBJECTS)
|
||||
iucode_tool_LDADD = $(LDADD)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
am__v_CC_1 =
|
||||
CCLD = $(CC)
|
||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(iucode_tool_SOURCES)
|
||||
DIST_SOURCES = $(iucode_tool_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
man8dir = $(mandir)/man8
|
||||
NROFF = nroff
|
||||
MANS = $(man_MANS)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||
$(LISP)iucode_tool_config.h.in
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
CSCOPE = cscope
|
||||
AM_RECURSIVE_TARGETS = cscope
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/iucode_tool.8.in \
|
||||
$(srcdir)/iucode_tool_config.h.in AUTHORS COPYING ChangeLog \
|
||||
INSTALL NEWS README TODO compile config.guess config.sub \
|
||||
depcomp install-sh missing
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
am__remove_distdir = \
|
||||
if test -d "$(distdir)"; then \
|
||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||
&& rm -rf "$(distdir)" \
|
||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||
else :; fi
|
||||
am__post_remove_distdir = $(am__remove_distdir)
|
||||
GZIP_ENV = --best
|
||||
DIST_ARCHIVES = $(distdir).tar.xz
|
||||
DIST_TARGETS = dist-xz
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CPUID_DEVICE_BASE = @CPUID_DEVICE_BASE@
|
||||
CPUID_DEVICE_PARENT = @CPUID_DEVICE_PARENT@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MICROCODE_DEVICE_DEFAULT = @MICROCODE_DEVICE_DEFAULT@
|
||||
MICROCODE_DIR_DEFAULT = @MICROCODE_DIR_DEFAULT@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
man_MANS = iucode_tool.8
|
||||
iucode_tool_SOURCES = intel_microcode.h intel_microcode.c iucode_tool.c
|
||||
EXTRA_DIST = autogen.sh CONTRIBUTING
|
||||
all: iucode_tool_config.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .o .obj
|
||||
am--refresh: Makefile
|
||||
@:
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
|
||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
echo ' $(SHELL) ./config.status'; \
|
||||
$(SHELL) ./config.status;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
iucode_tool_config.h: stamp-h1
|
||||
@test -f $@ || rm -f stamp-h1
|
||||
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
||||
|
||||
stamp-h1: $(srcdir)/iucode_tool_config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status iucode_tool_config.h
|
||||
$(srcdir)/iucode_tool_config.h.in: $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f iucode_tool_config.h stamp-h1
|
||||
iucode_tool.8: $(top_builddir)/config.status $(srcdir)/iucode_tool.8.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
install-sbinPROGRAMS: $(sbin_PROGRAMS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed 's/$(EXEEXT)$$//' | \
|
||||
while read p p1; do if test -f $$p \
|
||||
; then echo "$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n;h' \
|
||||
-e 's|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
||||
sed 'N;N;N;s,\n, ,g' | \
|
||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
if ($$2 == $$4) files[d] = files[d] " " $$1; \
|
||||
else { print "f", $$3 "/" $$4, $$1; } } \
|
||||
END { for (d in files) print "f", d, files[d] }' | \
|
||||
while read type dir files; do \
|
||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
|
||||
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-sbinPROGRAMS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
||||
-e 's/$$/$(EXEEXT)/' \
|
||||
`; \
|
||||
test -n "$$list" || exit 0; \
|
||||
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
|
||||
cd "$(DESTDIR)$(sbindir)" && rm -f $$files
|
||||
|
||||
clean-sbinPROGRAMS:
|
||||
-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
|
||||
|
||||
iucode_tool$(EXEEXT): $(iucode_tool_OBJECTS) $(iucode_tool_DEPENDENCIES) $(EXTRA_iucode_tool_DEPENDENCIES)
|
||||
@rm -f iucode_tool$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(iucode_tool_OBJECTS) $(iucode_tool_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intel_microcode.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iucode_tool.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
install-man8: $(man_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list1=''; \
|
||||
list2='$(man_MANS)'; \
|
||||
test -n "$(man8dir)" \
|
||||
&& test -n "`echo $$list1$$list2`" \
|
||||
|| exit 0; \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \
|
||||
{ for i in $$list1; do echo "$$i"; done; \
|
||||
if test -n "$$list2"; then \
|
||||
for i in $$list2; do echo "$$i"; done \
|
||||
| sed -n '/\.8[a-z]*$$/p'; \
|
||||
fi; \
|
||||
} | while read p; do \
|
||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; echo "$$p"; \
|
||||
done | \
|
||||
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
||||
sed 'N;N;s,\n, ,g' | { \
|
||||
list=; while read file base inst; do \
|
||||
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
||||
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
|
||||
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \
|
||||
fi; \
|
||||
done; \
|
||||
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \
|
||||
done; }
|
||||
|
||||
uninstall-man8:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list=''; test -n "$(man8dir)" || exit 0; \
|
||||
files=`{ for i in $$list; do echo "$$i"; done; \
|
||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
||||
sed -n '/\.8[a-z]*$$/p'; \
|
||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||
dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscope: cscope.files
|
||||
test ! -s cscope.files \
|
||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||
clean-cscope:
|
||||
-rm -f cscope.files
|
||||
cscope.files: clean-cscope cscopelist
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
-test -n "$(am__skip_mode_fix)" \
|
||||
|| find "$(distdir)" -type d ! -perm -755 \
|
||||
-exec chmod u+rwx,go+rx {} \; -o \
|
||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-lzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||
$(am__post_remove_distdir)
|
||||
dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
@echo WARNING: "Support for distribution archives compressed with" \
|
||||
"legacy program 'compress' is deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
@echo WARNING: "Support for shar distribution archives is" \
|
||||
"deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist dist-all:
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||
*.tar.xz*) \
|
||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
test -d $(distdir)/_build || exit 0; \
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& am__cwd=`pwd` \
|
||||
&& $(am__cd) $(distdir)/_build/sub \
|
||||
&& ../../configure \
|
||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||
distuninstallcheck \
|
||||
&& chmod -R a-w "$$dc_install_base" \
|
||||
&& ({ \
|
||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||
&& rm -rf "$$dc_destdir" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||
&& rm -rf $(DIST_ARCHIVES) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||
&& cd "$$am__cwd" \
|
||||
|| exit 1
|
||||
$(am__post_remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||
distuninstallcheck:
|
||||
@test -n '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: trying to run $@ with an empty' \
|
||||
'$$(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left after uninstall:" ; \
|
||||
if test -n "$(DESTDIR)"; then \
|
||||
echo " (check DESTDIR support)"; \
|
||||
fi ; \
|
||||
$(distuninstallcheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
distcleancheck: distclean
|
||||
@if test '$(srcdir)' = . ; then \
|
||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||
$(distcleancheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(PROGRAMS) $(MANS) iucode_tool_config.h
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-hdr distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-man
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am: install-sbinPROGRAMS
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man: install-man8
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf $(top_srcdir)/autom4te.cache
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-man uninstall-sbinPROGRAMS
|
||||
|
||||
uninstall-man: uninstall-man8
|
||||
|
||||
.MAKE: all install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \
|
||||
clean-cscope clean-generic clean-sbinPROGRAMS cscope \
|
||||
cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
||||
distcheck distclean distclean-compile distclean-generic \
|
||||
distclean-hdr distclean-tags distcleancheck distdir \
|
||||
distuninstallcheck dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-man8 install-pdf install-pdf-am install-ps \
|
||||
install-ps-am install-sbinPROGRAMS install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
|
||||
uninstall-am uninstall-man uninstall-man8 \
|
||||
uninstall-sbinPROGRAMS
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
|
@ -0,0 +1,141 @@
|
|||
v2.3:
|
||||
* Processor signature scan strategies can now be selected at
|
||||
runtime, using a new optional argument of the --scan-system
|
||||
option. It is possible to disable the "exact" scan strategy
|
||||
(which uses the kernel cpuid device) at build time to reduce the
|
||||
impact on executable size.
|
||||
* Microcode updates for a specific signature can now be optionally
|
||||
selected based on their revision, not just processor flags mask.
|
||||
|
||||
v2.2:
|
||||
* build infrastructure changes: autoconf 2.69 or later, and
|
||||
automake 1.13 or later are now required. The configure script
|
||||
will attempt to auto-detect and enable several warning and
|
||||
hardening options by default if CFLAGS/LDFLAGS are *unset*, or if
|
||||
given the new --enable-extend-flags option. "-O3" optimization
|
||||
mode will be used by default. The usual ways to override *FLAGS
|
||||
are respected by configure and the Makefile.
|
||||
|
||||
v2.1.1:
|
||||
* Fix CVE-2017-0357: iucode_tool: heap buffer overflow on -tr loader
|
||||
|
||||
v2.1:
|
||||
* The early initramfs cpio archives created by iucode_tool are now
|
||||
deterministic. Instead of the current system time, the date of
|
||||
the latest microcode included in the early initramfs will be used.
|
||||
* There is a new option to minimize the size of the early initramfs:
|
||||
--mini-earlyfw. This option causes iucode_tool to create a non-
|
||||
standard cpio archive which is typically 736 bytes smaller.
|
||||
WARNING: the microcode data file might not be visible to the
|
||||
regular initramfs when this mode is used.
|
||||
* iucode-tool will now create valid early initramfs archives past
|
||||
year 2038.
|
||||
|
||||
v2.0:
|
||||
* This new major version has several non-backwards-compatible
|
||||
changes. Scripts that scrape iucode_tool's stdout/stderr messages
|
||||
might have to be updated, and the behavior for -s and -S options
|
||||
changed.
|
||||
* The microcode listing output format used by --list and
|
||||
--list-all changed: the processor flags mask field is now
|
||||
labeled "pf_mask" instead of "pf mask", and the first field
|
||||
(bundle id/microcode id) is wider for --list-all, and completely
|
||||
changed for --list (refer to next entry).
|
||||
* The output for the --list option now uses the same microcode
|
||||
numbering used in --list-all and error messages, and also the
|
||||
same indentation as --list-all. For this reason, --list will
|
||||
output the bundle assignment list to stdout when not in --quiet
|
||||
mode, the same way --list-all does.
|
||||
* The --scan-system/-S option can now only be specified once, and
|
||||
it may be overridden by -s !<signature> options that come
|
||||
*after* it in command line ordering. To emulate the previous
|
||||
behavior, always specify --scan-system just once, and as the
|
||||
last option (i.e. after any -s options).
|
||||
* Error and warning messages, as well as some verbose (and debug)
|
||||
messages were updated, and some of them were demoted to higher
|
||||
verbosity levels.
|
||||
* Other relevant changes since v1.6.1:
|
||||
* Microcodes are now sorted by signature (ascending) and processor
|
||||
flags mask (descending). Before, microcodes with the same
|
||||
signature but different processor flags mask had unspecified
|
||||
ordering.
|
||||
* The .dat format loader was optimized to run a lot faster on
|
||||
files that match the Intel layout exactly, and improved its
|
||||
error detection.
|
||||
* iucode_tool now flushes output data files to permanent storage
|
||||
using fdatasync() before closing them, to better detect write
|
||||
errors. This causes a performance hit, but it is much safer.
|
||||
* Fix large file support (LFS) on 32-bit builds.
|
||||
* Abort with an error when attempting to write more than 4GiB to a
|
||||
cpio (early initramfs) archive, due to a limitation of that cpio
|
||||
file format.
|
||||
|
||||
v1.6.1:
|
||||
* Memory usage was greatly reduced when processing large microcode
|
||||
bundles.
|
||||
|
||||
v1.6:
|
||||
* Fix --scan-system to properly support mixed-stepping systems
|
||||
(broken since v1.2, partially fixed in v1.5.2).
|
||||
|
||||
v1.5:
|
||||
* There is a new option to write out microcodes, capable of writing
|
||||
out every revision of every microcode: --write-all-named-to. All
|
||||
other write out options will only output a single revision of a
|
||||
microcode. Refer to the manpage for details.
|
||||
|
||||
v1.4:
|
||||
* There is a new file type loader: -tr (recover microcode in
|
||||
binary format), which searches for valid microcodes in Intel
|
||||
binary format anywhere inside a binary file.
|
||||
|
||||
For standard, undamaged microcode data files, the default
|
||||
binary loader (-tb) should be used instead: it is faster, and
|
||||
it will properly complain of data file corruption. Refer to
|
||||
the manpage for details.
|
||||
|
||||
v1.3:
|
||||
* The .dat file loader was fixed to properly report IO errors, and
|
||||
enhanced to report the number of the line that caused a syntax
|
||||
error, as well as to accept comments at the end of a line.
|
||||
Before, comments had to be on a line of their own. Note that
|
||||
the .dat file loader assumes all comments start with / and span
|
||||
to the end of line.
|
||||
* It is now safe to call iucode_tool with stdin, stdout or stderr
|
||||
closed: /dev/null will be used, instead.
|
||||
|
||||
v1.2.1:
|
||||
* Due to gitorious.org planned shutdown at the end of 2015-05,
|
||||
iucode-tool has a new home at gitlab:
|
||||
|
||||
https://gitlab.com/iucode-tool
|
||||
|
||||
The old home at Debian Alioth will remain as a backup location:
|
||||
http://anonscm.debian.org/gitweb/?p=users/hmh/intel-microcode.git
|
||||
|
||||
v1.2:
|
||||
* Scalability improvement for --scan-system: by compile-time
|
||||
default, use the cpuid instruction directly on the running
|
||||
processor, and assume all other cores have the same
|
||||
signature. The code now depends on gcc's cpuid.h header.
|
||||
|
||||
v1.1:
|
||||
* Working support for extended signature tables
|
||||
|
||||
v1.0.2:
|
||||
* iucode-tool has a new home at gitorious:
|
||||
https://gitorious.org/iucode-tool
|
||||
|
||||
The old home at Debian Alioth will remain as a backup location:
|
||||
http://anonscm.debian.org/gitweb/?p=users/hmh/intel-microcode.git
|
||||
|
||||
v1.0:
|
||||
* Added --write-earlyfw, useful to support microcode
|
||||
updates during very early boot (kernel support added in
|
||||
Linux v3.9)
|
||||
* iucode_tool has implemented the most important features
|
||||
it currently needs, bump the major version number to 1.
|
||||
|
||||
v0.9:
|
||||
* Added -s! and --lose-date-filtering options, described in
|
||||
the iucode_tool(8) manpage.
|
|
@ -0,0 +1,331 @@
|
|||
|
||||
|
||||
iucode_tool - Intel® 64 and IA-32 processor microcode tool
|
||||
|
||||
Version 2.3.1
|
||||
Frebruary 5th, 2018
|
||||
|
||||
https://gitlab.com/iucode-tool
|
||||
|
||||
Intel® 64 and IA-32 system processors (x86_64 and i686 system processors)
|
||||
are capable of field-upgrading their control program (microcode). These
|
||||
microcode updates correct processor errata, and are often important for
|
||||
safe, correct system operation.
|
||||
|
||||
While most of the microcode updates fix problems that either happen rarely
|
||||
or are related to less commonly used features, there are enough updates
|
||||
fixing issues that would cause system lockup, memory corruption, and
|
||||
unpredictable system behavior, to warrant taking it seriously.
|
||||
|
||||
Microcode updates are ephemeral: they will be lost after a system processor
|
||||
hard reset or when the processor is powered off. They must be reapplied at
|
||||
every boot and after the system wakes up from suspend to RAM or to disk.
|
||||
|
||||
Updating the system processor microcode is the responsibility of the system
|
||||
firmware (BIOS or EFI). However, not all vendors will release timely
|
||||
updates for their firmware when Intel releases updated microcode, and most
|
||||
users don't update their system firmware in a timely fashion (or at all)
|
||||
anyway.
|
||||
|
||||
The end result is that, unless some other method of distributing microcode
|
||||
updates is in place, the processor in many systems will be running with
|
||||
outdated microcode, increasing the chances of incorrect system operation.
|
||||
|
||||
Intel has made available to the general public a microcode update data file
|
||||
(microcode bundle), which the operating system can use to install microcode
|
||||
updates independently from any system firmware updates. Currently, the
|
||||
same data file (microcode bundle) is used to distribute microcode updates
|
||||
for all Intel i686 and X86_64 processor models.
|
||||
|
||||
|
||||
Updating the system processor microcode:
|
||||
|
||||
The Intel-distributed microcode bundle contains microcode update data for
|
||||
several processor models. Older microcode releases used a text format
|
||||
which is unsuitable to be used directly by the Linux kernel: it must be
|
||||
converted by an utility like iucode_tool before Linux can use it. Newer
|
||||
releases have the same microcode update content both in the legacy text
|
||||
format, and in binary format.
|
||||
|
||||
Updating the processor microcode is a process that can be done at any time
|
||||
(even with the system at full load), and as many times as required. It is
|
||||
strongly recommended that microcode updates be applied during early system
|
||||
boot, though:
|
||||
|
||||
* Microcode updates should be applied as soon as possible to
|
||||
shorten the time window where the errata fixed by the update
|
||||
could still trigger;
|
||||
|
||||
* Some microcode updates can only be applied safely before the
|
||||
operating system enables more advanced processor functionality,
|
||||
otherwise that functionality must be disabled by the kernel
|
||||
(Atom PSE erratum);
|
||||
|
||||
* Some microcode updates disable (faulty) functionality or make
|
||||
other "visible" changes to the processor, and must be applied
|
||||
before either the kernel or applications start using that
|
||||
functionality (e.g. Haswell Intel TSX erratum).
|
||||
|
||||
Therefore, one should always apply microcode updates through firmware
|
||||
(BIOS/EFI) updates when possible. Failing that, one should use the "early
|
||||
initramfs" and "early microcode update driver" support in Linux v3.9 and
|
||||
later. As a last option, one can use the "late microcode update" driver,
|
||||
but this one might run too late to be of any help (and it cannot safely
|
||||
apply microcode updates such as the Intel Haswell TSX fix).
|
||||
|
||||
|
||||
To apply a microcode update using the early microcode kernel driver:
|
||||
|
||||
1. Arrange for iucode_tool --write-earlyfw to generate the early
|
||||
initramfs image from microcode data files. You probably want
|
||||
to also use --scan-system to reduce the size of the generated
|
||||
early initramfs image;
|
||||
|
||||
2. Either prepend the earlyfw image generated by iucode_tool to
|
||||
the initramfs, or, if your bootloader can handle it, arrange
|
||||
for it to load the early initramfs and the standard initramfs
|
||||
images in sequence;
|
||||
|
||||
3. Boot the system using a suitable Linux v3.9 or later kernel,
|
||||
compiled with kconfig options CONFIG_MICROCODE_EARLY=y and
|
||||
CONFIG_MICROCODE_INTEL_EARLY=y.
|
||||
|
||||
4. Ensure the late microcode update driver (microcode module) is
|
||||
either loaded or compiled in (CONFIG_MICROCODE=y), as it will
|
||||
be needed if the microcode needs to be reapplied to a processor,
|
||||
e.g. due to a suspend/resume or hibernate/resume cycle, or due
|
||||
to CPU hotplug.
|
||||
|
||||
This is usually handled by the Linux distro when you install microcode
|
||||
update support packages. Check your distro's documentation for details.
|
||||
|
||||
|
||||
To apply a microcode update for an Intel system processor after the Linux
|
||||
kernel boots, using the late microcode update driver (warning: this can
|
||||
render the system unusable if it applies a microcode update that disables
|
||||
processor features):
|
||||
|
||||
***** WARNING ***** the method below is unsafe ***** WARNING *****
|
||||
|
||||
1. Place the binary microcode in /lib/firmware/ with the correct
|
||||
file name (iucode_tool -K can do this automatically for Intel
|
||||
microcode);
|
||||
|
||||
2. Trigger a microcode refresh action, either by the initial load
|
||||
of the kernel "microcode" module, or if it is already loaded,
|
||||
by running the shell commands:
|
||||
|
||||
(Linux v3.6 and later)
|
||||
echo 1 > /sys/devices/system/cpu/microcode/reload
|
||||
|
||||
(Linux v3.5 and earlier)
|
||||
for i in /sys/devices/system/cpu/cpu[0-9]*/microcode/reload ; do
|
||||
echo 1 2>/dev/null > "$i" || true
|
||||
done
|
||||
|
||||
***** WARNING ***** the method above is unsafe ***** WARNING *****
|
||||
|
||||
|
||||
Downloading the microcode update data file from Intel:
|
||||
|
||||
A new version of the microcode update data bundle can be downloaded
|
||||
directly from Intel, by navigating to the support section looking for
|
||||
downloads for your processor. One could also search the Intel Download
|
||||
Center for "microcode linux":
|
||||
|
||||
https://downloadcenter.intel.com/SearchResult.aspx?keyword=microcode+linux
|
||||
|
||||
To manually install the downloaded microcode data, unpack the archive you
|
||||
got from Intel and copy the microcode-*.dat file from the archive to where
|
||||
your distro expects it, e.g. /usr/share/misc/intel-microcode.dat
|
||||
|
||||
If your distro uses /lib/firmware to update microcode, you should instead
|
||||
use "iucode_tool -K" to convert the downloaded microcode bundle to binary
|
||||
firmware files.
|
||||
|
||||
You should make sure the microcode data is owned by root, and that it can
|
||||
only be written to by root (e.g. mode 0644) for security reasons:
|
||||
|
||||
(example, adjust as needed for your Linux distro):
|
||||
|
||||
chown root:root /usr/share/misc/intel-microcode.dat
|
||||
chmod 0644 /usr/share/misc/intel-microcode.dat
|
||||
|
||||
(example, if using /lib/firmware):
|
||||
|
||||
chown -R root:root /lib/firmware/intel-ucode
|
||||
find /lib/firmware/intel-ucode -type d -exec chmod 0755 {} \;
|
||||
find /lib/firmware/intel-ucode -type f -exec chmod 0644 {} \;
|
||||
|
||||
You might have to regenerate the initramfs image to get the updated
|
||||
microcode files into the initramfs. The proper way to do this is
|
||||
distro-specific.
|
||||
|
||||
If your distro has no use for the .dat file after you installed updated
|
||||
binary files to /lib/firmware, you can remove it to save some space.
|
||||
|
||||
|
||||
About the Intel-supplied microcode updates file:
|
||||
|
||||
Unfortunately, as of November 2014, Intel still does not usually publish
|
||||
any information about changes to the intel-microcode.dat distribution to
|
||||
the general public. Such information may be available through restricted
|
||||
developer and partner channels, though. Very rarely, a specification
|
||||
update might carry some information about the errata fixed by the latest
|
||||
microcode revision.
|
||||
|
||||
Intel removes microcode from their public distribution regularly. One can
|
||||
theorize that removals of microcode updates for very old processors that
|
||||
were distributed over a reasonable number of microcode data file releases
|
||||
were done to reduce bundle file growth. Unfortunately, such removals could
|
||||
cause unnecessary regressions on very old, but still operational hardware,
|
||||
so distros used on older hardware might want to still ship them.
|
||||
|
||||
On recent processors, Intel microcode release management can be puzzling:
|
||||
Intel has often removed from the distribution microcode for recent
|
||||
processors, as well as microcode that it had recently issued updates for.
|
||||
Microcode version downgrades have also been observed.
|
||||
|
||||
We can only hope that Intel will start publishing microcode update
|
||||
changelog information to the general public in the future. This would
|
||||
certainly make it easier for distros to schedule microcode updates for
|
||||
their stable branches.
|
||||
|
||||
|
||||
|
||||
Technical details (optional reading)
|
||||
|
||||
|
||||
Intel Microcode signatures:
|
||||
|
||||
Intel system processor microcode is identified by the processor signature
|
||||
(a 32-bit number) and by three bits called "processor flags". The
|
||||
Microcode is often, but not always, the same among several processors that
|
||||
differ only on their processor flags, and have the same processor
|
||||
signature.
|
||||
|
||||
These signatures are useful when one wants to look for entries referring to
|
||||
a specific processor in documentation, or request that iucode_tool create
|
||||
microcode binary bundles for a specific set of processors. Otherwise, you
|
||||
can just ignore them as they are handled automatically by iucode_tool and
|
||||
by the kernel microcode driver.
|
||||
|
||||
If you want to know the signature of the processors in your system, run
|
||||
"iucode_tool --scan-system". It is possible for a multiprocessor system
|
||||
to contain processors with different signatures (known as mixed stepping
|
||||
configurations), although this is usually not an ideal configuration.
|
||||
|
||||
The processor signature is returned in the EAX register from leaf 1 of the
|
||||
CPUID instruction. It contains an encoded format of the CPU stepping,
|
||||
model, family and type, and a few undefined (reserved) bits that are zero
|
||||
on all current Intel processors.
|
||||
|
||||
|
||||
Listing what is inside a microcode bundle:
|
||||
|
||||
The microcode signatures for each microcode available in a microcode bundle
|
||||
can be listed by iucode_tool:
|
||||
|
||||
iucode_tool -L /usr/share/misc/intel-microcode.dat
|
||||
|
||||
microcode bundle 1: /usr/share/misc/intel-microcode.dat
|
||||
001/001: sig 0x00000683, pf_mask 0x01, 2001-02-06, rev 0x0013, size 2048
|
||||
001/002: sig 0x00000f4a, pf_mask 0x5c, 2005-12-14, rev 0x0004, size 2048
|
||||
001/003: sig 0x00000653, pf_mask 0x04, 1999-05-20, rev 0x000b, size 2048
|
||||
...
|
||||
|
||||
The first and third microcode updates are for very specific processor
|
||||
models (a single combination of processor flags, each, as they only have
|
||||
one bit set in the pf_mask field). The second microcode update applies to
|
||||
several processors that share the same family, model and stepping, but have
|
||||
different processor flags (more than one bit set in the pf_mask field). The
|
||||
processor flags and pf_mask field are explained below.
|
||||
|
||||
iucode_tool -L s000406A8_m00000001_r0000081F.fw
|
||||
|
||||
microcode bundle 1: s000406A8_m00000001_r0000081F.fw
|
||||
001/001: sig 0x000406a8, pf_mask 0x01, 2014-08-12, rev 0x081f, size 38912
|
||||
sig 0x000406a8, pf_mask 0x01, 2014-08-12, rev 0x081f
|
||||
sig 0x000406a9, pf_mask 0x01, 2014-08-12, rev 0x081f
|
||||
|
||||
This is a microcode update with multiple signatures. At least one of the
|
||||
signatures will typically be a duplicate. iucode_tool will act on each
|
||||
signature (list, select, etc) as if they were independent, but when writing
|
||||
out the microcode, all of its signatures will be included. It will not
|
||||
output more than a single copy of the microcode to the same output file.
|
||||
|
||||
|
||||
Microcode revisions:
|
||||
|
||||
Microcode revisions are signed 32-bit integers. Negative revisions are
|
||||
used by Intel during microcode and chip development, and will not be found
|
||||
on public microcode updates: you'd usually find such microcode only in
|
||||
UEFI/BIOS images, to support Engineering Sample processors.
|
||||
|
||||
Revision 0 is used by the system processor to signal that it is running the
|
||||
factory-provided microcode (i.e. no microcode updates were installed). No
|
||||
Intel processor to date (since the Pentium Pro) is supposed to run with
|
||||
factory (revision 0) microcode: a lot of functionality will be either
|
||||
extremely buggy or missing entirely.
|
||||
|
||||
iucode_tool will list negative revisions as a large unsigned number.
|
||||
However, it will prefer positive revisions over negative revisions when
|
||||
selecting microcode.
|
||||
|
||||
microcode bundle 1: coreboot/s00040650_m00000072_rFFFF000A.fw
|
||||
01/001: sig 0x00040650, pf_mask 0x72, 2012-11-09, rev 0xffff000a, size 22528
|
||||
|
||||
The release dates are useful to track how old a microcode update is, but
|
||||
are otherwise ignored by the kernel driver: Intel documentation clearly
|
||||
states that only the revision number should be used to decide which
|
||||
microcode update is more recent.
|
||||
|
||||
|
||||
Microcode processor flags mask (pf_mask):
|
||||
|
||||
Some Intel processor variants may share the same processor signature, and
|
||||
yet require different microcode. These processors can be told apart by
|
||||
checking their "processor flags" (bits 52, 51 and 50 of MSR 17h,
|
||||
IA32_PLATFORM_ID).
|
||||
|
||||
processor flags processor flags mask
|
||||
000b (0) 00000001b (01h)
|
||||
001b (1) 00000010b (02h)
|
||||
010b (2) 00000100b (04h)
|
||||
011b (3) 00001000b (08h)
|
||||
100b (4) 00010000b (10h)
|
||||
101b (5) 00100000b (20h)
|
||||
110b (6) 01000000b (40h)
|
||||
111b (7) 10000000b (80h)
|
||||
|
||||
The microcode data file has a field called "processor flags mask", or
|
||||
"pf_mask" for short, where a bit is set if the microcode can be applied to
|
||||
a processor with that set of processor flags. E.g. if bit 6 is set, that
|
||||
microcode can be applied to a processor with the appropriate signature and
|
||||
the processor flags combination 110 (in binary).
|
||||
|
||||
A microcode update identified by a processor flags mask of 42 (hexadecimal)
|
||||
would apply to two types of processors: those with processor flags
|
||||
combination 001 (binary), and also those with processor flags combination
|
||||
110 (binary).
|
||||
|
||||
The definition of what a processor flag combination means varies with the
|
||||
processor model.
|
||||
|
||||
Some very old processors lack processor flags support. In that case,
|
||||
microcode updates will have an empty processor flag mask (all bits clear).
|
||||
|
||||
When the "microcode" kernel driver is loaded, the processor flags
|
||||
combination for each online processor in a system will be available through
|
||||
sysfs. These sysfs nodes follow the pattern:
|
||||
/sys/devices/system/cpu/cpu*/microcode/processor_flags
|
||||
|
||||
NOTE: iucode_tool prefixes hexadecimal values with "0x".
|
||||
|
||||
|
||||
Further reading:
|
||||
|
||||
The Intel 64 and IA-32 Architectures Software Developer's Manual, Volume
|
||||
3A: System Programming Guide, Part 1 (order number 253668), section 9.11.
|
||||
|
||||
* Note: Intel is a registered trademark of Intel Corporation.
|
|
@ -0,0 +1,19 @@
|
|||
* Extended status codes, so that we can tell the user
|
||||
exactly why we don't want to load a "supposed microcode",
|
||||
e.g. "extended table checksum is incorrect".
|
||||
|
||||
* Compressor support (gzip, others) without the need for
|
||||
stdin tricks (gzip -dc file.bin.gz | iucode_tool -k -).
|
||||
VERY useful for .dat files, less so for .bin files.
|
||||
|
||||
* Microcode selection:
|
||||
* select microcodes which were already installed in -K dir
|
||||
* select/unselect by signature+pfmask+revision
|
||||
|
||||
* change code to actually be able to select and merge in
|
||||
a lossless way, would simplify things a lot.
|
||||
|
||||
* error handling
|
||||
- return status when we skip a ucode? when we skip a file?
|
||||
|
||||
* --overwrite: removes symlinks. Maybe it would be better to fail?
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Commands required to prepare tree for building after
|
||||
# a clean checkout
|
||||
|
||||
autoreconf -i
|
|
@ -0,0 +1,347 @@
|
|||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2012-10-14.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# This program 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 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,334 @@
|
|||
dnl Process this file with autoconf 2.69+ to produce a configure script.
|
||||
dnl
|
||||
dnl Copyright (c) 2010-2018 Henrique de Moraes Holschuh
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with this program; if not, write to the Free Software
|
||||
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([iucode_tool], [2.3.1],
|
||||
[https://gitlab.com/iucode-tool/iucode-tool/issues],
|
||||
[iucode-tool],
|
||||
[https://gitlab.com/iucode-tool/iucode-tool/wikis/home])
|
||||
AC_COPYRIGHT([Copyright (c) 2010-2018 Henrique de Moraes Holschuh])
|
||||
|
||||
AC_CONFIG_SRCDIR([iucode_tool.c])
|
||||
AC_CANONICAL_HOST
|
||||
AM_INIT_AUTOMAKE([1.13 gnu no-dist-gzip dist-xz -Wall])
|
||||
AC_CONFIG_HEADERS([iucode_tool_config.h])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
dnl Work around the lack of a way to set preferred *FLAGS
|
||||
AC_ARG_ENABLE([extend-flags],
|
||||
[AC_HELP_STRING([--enable-extend-flags],
|
||||
[force configure to extend already-defined C/CPP/LDFLAGS])],
|
||||
[
|
||||
AC_MSG_NOTICE([will extend C/CPP/LDFLAGS])
|
||||
enable_cflags_setting=yes
|
||||
enable_cppflags_setting=yes
|
||||
enable_ldflags_setting=yes
|
||||
enable_extend_flags=yes
|
||||
],
|
||||
[
|
||||
AC_MSG_CHECKING([whether configure.ac should try to override CFLAGS])
|
||||
if test "x${CFLAGS+set}" = xset; then
|
||||
enable_cflags_setting=no
|
||||
else
|
||||
enable_cflags_setting=yes
|
||||
fi
|
||||
AC_MSG_RESULT($enable_cflags_setting)
|
||||
|
||||
dnl AC_MSG_CHECKING([whether configure.ac should try to override CPPFLAGS])
|
||||
dnl if test "x${CPPFLAGS+set}" = xset; then
|
||||
dnl enable_cppflags_setting=no
|
||||
dnl else
|
||||
dnl enable_cppflags_setting=yes
|
||||
dnl fi
|
||||
dnl AC_MSG_RESULT($enable_cppflags_setting)
|
||||
|
||||
AC_MSG_CHECKING([whether configure.ac should try to override LDFLAGS])
|
||||
if test "x${LDFLAGS+set}" = xset; then
|
||||
enable_ldflags_setting=no
|
||||
else
|
||||
enable_ldflags_setting=yes
|
||||
fi
|
||||
AC_MSG_RESULT($enable_ldflags_setting)
|
||||
])
|
||||
|
||||
dnl Before we get to the C compiler...
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
dnl Checks for programs
|
||||
AC_PROG_CC
|
||||
|
||||
dnl Checks for headers
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h unistd.h time.h cpuid.h])
|
||||
|
||||
dnl Other important checks
|
||||
AC_C_BIGENDIAN([AC_ERROR([This program does not work on big-endian systems])])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_INLINE
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SSIZE_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT8_T
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
AC_FUNC_STAT
|
||||
AC_CHECK_FUNCS([memset strcasecmp strdup strerror strrchr strtoul strtoull timegm])
|
||||
|
||||
# Allow GNU Argp as a standalone lib, as an alternative to glibc
|
||||
AC_SEARCH_LIBS([argp_parse], [argp], [],
|
||||
[AC_ERROR([An implementation of GNU Argp was not found, please install libargp])])
|
||||
|
||||
dnl important system extensions
|
||||
AC_SYS_LARGEFILE
|
||||
AC_CHECK_FUNCS([flockfile fgets_unlocked])
|
||||
|
||||
dnl -----------------
|
||||
dnl Configure options
|
||||
dnl -----------------
|
||||
|
||||
AC_ARG_WITH([default-kernel-device],
|
||||
[AS_HELP_STRING([--with-default-kernel-device=PATH],
|
||||
[default microcode device (/dev/cpu/microcode)])],
|
||||
[AS_IF([test "x$withval" = "x" || test "x$withval" = "xno"],
|
||||
[AC_ERROR([--without-kernel-device build unsupported])],
|
||||
[MICROCODE_DEVICE_DEFAULT="$withval"])],
|
||||
[MICROCODE_DEVICE_DEFAULT="/dev/cpu/microcode"])
|
||||
AC_DEFINE_UNQUOTED(MICROCODE_DEVICE_DEFAULT, "$MICROCODE_DEVICE_DEFAULT",
|
||||
[Path to kernel microcode device])
|
||||
AC_SUBST(MICROCODE_DEVICE_DEFAULT)
|
||||
|
||||
AC_ARG_WITH([default-firmware-dir],
|
||||
[AS_HELP_STRING([--with-default-firmware-dir=PATH],
|
||||
[default firmware loader directory (/lib/firmware/intel-ucode)])],
|
||||
[AS_IF([test "x$withval" = "x" || test "x$withval" = "xno"],
|
||||
[AC_ERROR([--without-default-firmware-dir build unsupported])],
|
||||
[MICROCODE_DIR_DEFAULT="$withval"])],
|
||||
[MICROCODE_DIR_DEFAULT="/lib/firmware/intel-ucode"])
|
||||
AC_DEFINE_UNQUOTED(MICROCODE_DIR_DEFAULT, "$MICROCODE_DIR_DEFAULT",
|
||||
[Path to the kernel microcode firmware directory])
|
||||
AC_SUBST(MICROCODE_DIR_DEFAULT)
|
||||
|
||||
AC_ARG_WITH([cpuid-device-parent],
|
||||
[AS_HELP_STRING([--with-cpuid-device-parent=PATH],
|
||||
[per-cpu devices parent directory (/dev/cpu)])],
|
||||
[AS_IF([test "x$withval" = "x" || test "x$withval" = "xno"],
|
||||
[AC_ERROR([use --disable-cpuid-device instead of --without-cpuid-device-parent])],
|
||||
[CPUID_DEVICE_PARENT="$withval"])],
|
||||
[CPUID_DEVICE_PARENT="/dev/cpu"])
|
||||
AC_DEFINE_UNQUOTED(CPUID_DEVICE_PARENT, "$CPUID_DEVICE_PARENT",
|
||||
[path to the per-cpu tree of cpuid devices])
|
||||
AC_SUBST(CPUID_DEVICE_PARENT)
|
||||
AC_ARG_WITH([cpuid-device-base],
|
||||
[AS_HELP_STRING([--with-cpuid-device-base=PATH_FORMAT],
|
||||
[per-cpu cpuid device format string, relative to CPUID_DEVICE_PARENT (%s/cpuid)])],
|
||||
[AS_IF([test "x$withval" = "x" || test "x$withval" = "xno"],
|
||||
[AC_ERROR([use --disable-cpuid-device instead of --without-cpuid-device-base])],
|
||||
[CPUID_DEVICE_BASE="$withval"])],
|
||||
[CPUID_DEVICE_BASE="%s/cpuid"])
|
||||
AC_DEFINE_UNQUOTED(CPUID_DEVICE_BASE, "$CPUID_DEVICE_BASE",
|
||||
[snprintf format string for the per-cpu cpuid device path, relative to CPUID_DEVICE_NAME])
|
||||
AC_SUBST(CPUID_DEVICE_BASE)
|
||||
|
||||
AC_ARG_ENABLE([cpuid-device],
|
||||
[AS_HELP_STRING([--disable-cpuid-device],
|
||||
[disable support for the Linux cpuid device (cripples --scan-system=exact)])])
|
||||
AS_IF([test "x${enable_cpuid_device}" != "xno"],
|
||||
[AC_DEFINE(USE_CPUID_DEVICE, [], [Support scanning every core using Linux cpuid device])])
|
||||
|
||||
AC_ARG_ENABLE([valgrind-build],
|
||||
[AS_HELP_STRING([--enable-valgrind-build],
|
||||
[build for valgrind testing])],
|
||||
[AS_IF([test "x$enableval" != "xno"],
|
||||
[AC_DEFINE(VALGRIND_BUILD, [], [Valgrind-friendly build])])
|
||||
])
|
||||
|
||||
dnl -------------------------------------------
|
||||
dnl Override hardcoded *FLAGS for GCC and Clang
|
||||
dnl If this breaks your platform, file a bug
|
||||
dnl -------------------------------------------
|
||||
|
||||
dnl Do it after most of the autoconf crap, as they tend to screw
|
||||
dnl up when you have anything more complex than -O2 -g for CFLAGS.
|
||||
|
||||
dnl We could do most of these overrides through AM_*FLAGS, but
|
||||
dnl that's a pain for distros and users to override (as in it breaks
|
||||
dnl 'make CFLAGS="-O0"') and only to be used for stuff that is
|
||||
dnl absolutely essential to the build.
|
||||
|
||||
dnl if test "${GCC}${enable_cppflags_setting}" = "yesyes" ; then
|
||||
dnl CPPFLAGS="<whatever>"
|
||||
dnl fi
|
||||
if test "x${GCC}${enable_cflags_setting}" = "xyesyes" ; then
|
||||
dnl in "extend mode", we will get either user-supplied,
|
||||
dnl or the autoconf-default CFLAGS
|
||||
if test "x${enable_extend_flags}" != "xyes"; then
|
||||
CFLAGS="-O3 -g"
|
||||
fi
|
||||
|
||||
dnl We need to detect -Wunknown-warning without the use of -Werror.
|
||||
dnl -Werror would be unsafe, as it might eventually trigger on the
|
||||
dnl test source code.
|
||||
dnl
|
||||
dnl clang needs "-Werror=unknown-warning-option".
|
||||
dnl gcc exits with an error when trying to enable unknown warnings.
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],
|
||||
[CFLAGSERRUW="-Werror=unknown-warning-option"],
|
||||
[],
|
||||
[],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
|
||||
dnl gcc and clang warnings the code is not supposed to trigger...
|
||||
AX_APPEND_COMPILE_FLAGS(
|
||||
[-Wall -Wextra -Wformat=2 -Werror=format-security dnl
|
||||
-Wformat-signedness -Wformat-overflow=2 -Wformat-truncation=2 dnl
|
||||
-Wtrampolines -Wcast-align -Wsign-conversion -Wnull-dereference dnl
|
||||
-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations dnl
|
||||
-Wredundant-decls -Wstrict-overflow -Winit-self -Wshadow dnl
|
||||
-Wrestrict -Wpointer-arith -Wlogical-op -Wbad-function-cast dnl
|
||||
-Wwrite-strings -Wduplicated-branches -Wduplicated-cond dnl
|
||||
-Walloca -Wvla -Walloc-zero -Walloc-size-larger-than=1073741824],
|
||||
[],
|
||||
[${CFLAGSERRUW}],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
|
||||
dnl Do not move _FORTIFY_SOURCE to CPPFLAGS, otherwise bad things
|
||||
dnl happen when the user does 'make CFLAGS="-O0 -g"'. Debian/Ubuntu
|
||||
dnl have fixes for this, but others don't. We keep it in CFLAGS
|
||||
dnl where it will get overriden along with -O3/-O2.
|
||||
AC_MSG_CHECKING([whether _FORTIFY_SOURCE is already enabled])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(void) {
|
||||
#ifndef _FORTIFY_SOURCE
|
||||
return 0;
|
||||
#else
|
||||
#error _FORTIFY_SOURCE already defined
|
||||
#endif
|
||||
}
|
||||
]])],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
dnl gcc manual says to avoid -Wp,-D like the plague and use
|
||||
dnl -D/-U directly.
|
||||
AX_APPEND_COMPILE_FLAGS([-D_FORTIFY_SOURCE=2], [], [],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char arr[64], *dst = arr, *src = argv[0];
|
||||
if (argc && src) { while (*src) { *dst++ = *src++; } }
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
])
|
||||
|
||||
AX_APPEND_COMPILE_FLAGS([-fstack-protector-strong -Wstack-protector],
|
||||
[],
|
||||
[],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char arr[64], *dst = arr, *src = argv[0];
|
||||
if (argc && src) { while (*src) { *dst++ = *src++; } }
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
fi
|
||||
if test "x${GCC}${enable_ldflags_setting}" = "xyesyes" ; then
|
||||
AX_APPEND_LINK_FLAGS([-Wl,-z,relro -Wl,-z,now], [], [],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char arr[64], *dst = arr, *src = argv[0];
|
||||
if (argc && src) { while (*src) { *dst++ = *src++; } }
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
fi
|
||||
if test "x${GCC}${enable_ldflags_setting}${enable_cflags_setting}" = "xyesyesyes" ; then
|
||||
AC_MSG_NOTICE([checking for Position Independent Executables (PIE) support])
|
||||
OCFLAGS="${CFLAGS}"
|
||||
AX_CHECK_COMPILE_FLAG([-fPIE],
|
||||
[
|
||||
CFLAGS="${CFLAGS} -fPIE"
|
||||
AX_CHECK_LINK_FLAG([-fPIE -pie],
|
||||
[LDFLAGS="${LDFLAGS} -fPIE -pie"
|
||||
AC_MSG_NOTICE([PIE generation enabled])],
|
||||
[CFLAGS="${OCFLAGS}"
|
||||
AC_MSG_NOTICE([PIE generation not supported by linker])],
|
||||
[],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
],
|
||||
[AC_MSG_NOTICE([PIE generation not supported by compiler])],
|
||||
[],
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
fi
|
||||
|
||||
dnl --------------------------
|
||||
dnl autoconf output generation
|
||||
dnl --------------------------
|
||||
|
||||
AC_MSG_NOTICE([project-wide base CPPFLAGS: $CPPFLAGS])
|
||||
AC_MSG_NOTICE([project-wide base CFLAGS: $CFLAGS])
|
||||
AC_MSG_NOTICE([project-wide base LDFLAGS: $LDFLAGS])
|
||||
|
||||
AC_CONFIG_FILES([Makefile iucode_tool.8])
|
||||
AC_OUTPUT
|
|
@ -0,0 +1,791 @@
|
|||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2013-05-30.07; # UTC
|
||||
|
||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This program 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 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||
as side-effects.
|
||||
|
||||
Environment variables:
|
||||
depmode Dependency tracking mode.
|
||||
source Source file read by 'PROGRAMS ARGS'.
|
||||
object Object file output by 'PROGRAMS ARGS'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
depfile Dependency file to output.
|
||||
tmpdepfile Temporary file to use when outputting dependencies.
|
||||
libtool Whether libtool is used (yes/no).
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "depcomp $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
# Get the directory component of the given path, and save it in the
|
||||
# global variables '$dir'. Note that this directory component will
|
||||
# be either empty or ending with a '/' character. This is deliberate.
|
||||
set_dir_from ()
|
||||
{
|
||||
case $1 in
|
||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||
*) dir=;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Get the suffix-stripped basename of the given path, and save it the
|
||||
# global variable '$base'.
|
||||
set_base_from ()
|
||||
{
|
||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||
}
|
||||
|
||||
# If no dependency file was actually created by the compiler invocation,
|
||||
# we still have to create a dummy depfile, to avoid errors with the
|
||||
# Makefile "include basename.Plo" scheme.
|
||||
make_dummy_depfile ()
|
||||
{
|
||||
echo "#dummy" > "$depfile"
|
||||
}
|
||||
|
||||
# Factor out some common post-processing of the generated depfile.
|
||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||
aix_post_process_depfile ()
|
||||
{
|
||||
# If the compiler actually managed to produce a dependency file,
|
||||
# post-process it.
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form 'foo.o: dependency.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# $object: dependency.h
|
||||
# and one to simply output
|
||||
# dependency.h:
|
||||
# which is needed to avoid the deleted-header problem.
|
||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||
} > "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
}
|
||||
|
||||
# A tabulation character.
|
||||
tab=' '
|
||||
# A newline character.
|
||||
nl='
|
||||
'
|
||||
# Character ranges might be problematic outside the C locale.
|
||||
# These definitions help.
|
||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
lower=abcdefghijklmnopqrstuvwxyz
|
||||
digits=0123456789
|
||||
alpha=${upper}${lower}
|
||||
|
||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||
depfile=${depfile-`echo "$object" |
|
||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Avoid interferences from the environment.
|
||||
gccflag= dashmflag=
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# parameterize here, but still list the modes in the big case below,
|
||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||
# here, because this file can only contain one case statement.
|
||||
if test "$depmode" = hp; then
|
||||
# HP compiler uses -M and no extra arg.
|
||||
gccflag=-M
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
cygpath_u="cygpath -u -f -"
|
||||
if test "$depmode" = msvcmsys; then
|
||||
# This is just like msvisualcpp but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvisualcpp
|
||||
fi
|
||||
|
||||
if test "$depmode" = msvc7msys; then
|
||||
# This is just like msvc7 but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvc7
|
||||
fi
|
||||
|
||||
if test "$depmode" = xlc; then
|
||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||
gccflag=-qmakedep=gcc,-MF
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
case "$depmode" in
|
||||
gcc3)
|
||||
## gcc 3 implements dependency tracking that does exactly what
|
||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||
## the command line argument order; so add the flags where they
|
||||
## appear in depend2.am. Note that the slowdown incurred here
|
||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||
*) set fnord "$@" "$arg" ;;
|
||||
esac
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
done
|
||||
"$@"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
mv "$tmpdepfile" "$depfile"
|
||||
;;
|
||||
|
||||
gcc)
|
||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||
## (see the conditional assignment to $gccflag above).
|
||||
## There are various ways to get dependency output from gcc. Here's
|
||||
## why we pick this rather obscure method:
|
||||
## - Don't want to use -MD because we'd like the dependencies to end
|
||||
## up in a subdir. Having to rename by hand is ugly.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||
## supported by the other compilers which use the 'gcc' depmode.
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
gccflag=-MD,
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The second -e expression handles DOS-style file names with drive
|
||||
# letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||
## This next piece of magic avoids the "deleted header file" problem.
|
||||
## The problem is that when a header file which appears in a .P file
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
## Some versions of gcc put a space before the ':'. On the theory
|
||||
## that the space means something, we add a space to the output as
|
||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||
## to the object. Take care to not repeat it in the output.
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
sgi)
|
||||
if test "$libtool" = yes; then
|
||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||
else
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
# Clip off the initial element (the dependent). Don't try to be
|
||||
# clever and replace this with sed code, as IRIX sed won't handle
|
||||
# lines with more than a fixed number of characters (4096 in
|
||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||
# dependency line.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||
| tr "$nl" ' ' >> "$depfile"
|
||||
echo >> "$depfile"
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
xlc)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
aix)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# in a .u file. In older versions, this file always lives in the
|
||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||
# start of each line; $object doesn't have directory information.
|
||||
# Version 6 uses the directory in both cases.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
tmpdepfile3=$dir.libs/$base.u
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$dir$base.u
|
||||
tmpdepfile3=$dir$base.u
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
tcc)
|
||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||
# FIXME: That version still under development at the moment of writing.
|
||||
# Make that this statement remains true also for stable, released
|
||||
# versions.
|
||||
# It will wrap lines (doesn't matter whether long or short) with a
|
||||
# trailing '\', as in:
|
||||
#
|
||||
# foo.o : \
|
||||
# foo.c \
|
||||
# foo.h \
|
||||
#
|
||||
# It will put a trailing '\' even on the last line, and will use leading
|
||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||
# "Emit spaces for -MD").
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||
# We have to change lines of the first kind to '$object: \'.
|
||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||
# dummy dependency, to avoid the deleted-header problem.
|
||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
## The order of this option in the case statement is important, since the
|
||||
## shell code in configure will try each of these formats in the order
|
||||
## listed in this file. A plain '-MD' option would be understood by many
|
||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||
pgcc)
|
||||
# Portland's C compiler understands '-MD'.
|
||||
# Will always output deps to 'file.d' where file is the root name of the
|
||||
# source file under compilation, even if file resides in a subdirectory.
|
||||
# The object file name does not affect the name of the '.d' file.
|
||||
# pgcc 10.2 will output
|
||||
# foo.o: sub/foo.c sub/foo.h
|
||||
# and will wrap long lines using '\' :
|
||||
# foo.o: sub/foo.c ... \
|
||||
# sub/foo.h ... \
|
||||
# ...
|
||||
set_dir_from "$object"
|
||||
# Use the source, not the object, to determine the base name, since
|
||||
# that's sadly what pgcc will do too.
|
||||
set_base_from "$source"
|
||||
tmpdepfile=$base.d
|
||||
|
||||
# For projects that build the same source file twice into different object
|
||||
# files, the pgcc approach of using the *source* file root name can cause
|
||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||
# the same $tmpdepfile.
|
||||
lockdir=$base.d-lock
|
||||
trap "
|
||||
echo '$0: caught signal, cleaning up...' >&2
|
||||
rmdir '$lockdir'
|
||||
exit 1
|
||||
" 1 2 13 15
|
||||
numtries=100
|
||||
i=$numtries
|
||||
while test $i -gt 0; do
|
||||
# mkdir is a portable test-and-set.
|
||||
if mkdir "$lockdir" 2>/dev/null; then
|
||||
# This process acquired the lock.
|
||||
"$@" -MD
|
||||
stat=$?
|
||||
# Release the lock.
|
||||
rmdir "$lockdir"
|
||||
break
|
||||
else
|
||||
# If the lock is being held by a different process, wait
|
||||
# until the winning process is done or we timeout.
|
||||
while test -d "$lockdir" && test $i -gt 0; do
|
||||
sleep 1
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
fi
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
trap - 1 2 13 15
|
||||
if test $i -le 0; then
|
||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||
echo "$0: check lockdir '$lockdir'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each line is of the form `foo.o: dependent.h',
|
||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp2)
|
||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||
# compilers, which have integrated preprocessors. The correct option
|
||||
# to use with these is +Maked; it writes dependencies to a file named
|
||||
# 'foo.d', which lands next to the object file, wherever that
|
||||
# happens to be.
|
||||
# Much of this is similar to the tru64 case; see comments there.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir.libs/$base.d
|
||||
"$@" -Wc,+Maked
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
"$@" +Maked
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add 'dependent.h:' lines.
|
||||
sed -ne '2,${
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||
# dependencies in 'foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||
# in $dir$base.o.d. We have to check for both files, because
|
||||
# one of the two compilations can be disabled. We should prefer
|
||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
# Same post-processing that is required for AIX mode.
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
msvc7)
|
||||
if test "$libtool" = yes; then
|
||||
showIncludes=-Wc,-showIncludes
|
||||
else
|
||||
showIncludes=-showIncludes
|
||||
fi
|
||||
"$@" $showIncludes > "$tmpdepfile"
|
||||
stat=$?
|
||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The first sed program below extracts the file names and escapes
|
||||
# backslashes for cygpath. The second sed program outputs the file
|
||||
# name when reading, but also accumulates all include files in the
|
||||
# hold buffer in order to output them again at the end. This only
|
||||
# works with sed implementations that can handle large buffers.
|
||||
sed < "$tmpdepfile" -n '
|
||||
/^Note: including file: *\(.*\)/ {
|
||||
s//\1/
|
||||
s/\\/\\\\/g
|
||||
p
|
||||
}' | $cygpath_u | sort -u | sed -n '
|
||||
s/ /\\ /g
|
||||
s/\(.*\)/'"$tab"'\1 \\/p
|
||||
s/.\(.*\) \\/\1:/
|
||||
H
|
||||
$ {
|
||||
s/.*/'"$tab"'/
|
||||
G
|
||||
p
|
||||
}' >> "$depfile"
|
||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvc7msys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
#nosideeffect)
|
||||
# This comment above is used by automake to tell side-effect
|
||||
# dependency tracking mechanisms from slower ones.
|
||||
|
||||
dashmstdout)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout, regardless of -o.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -z "$dashmflag" && dashmflag=-M
|
||||
# Require at least two characters before searching for ':'
|
||||
# in the target name. This is to cope with DOS-style filenames:
|
||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||
"$@" $dashmflag |
|
||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
dashXmstdout)
|
||||
# This case only exists to satisfy depend.m4. It is never actually
|
||||
# run, as this mode is specially recognized in the preamble.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
makedepend)
|
||||
"$@" || exit $?
|
||||
# Remove any Libtool call
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
# X makedepend
|
||||
shift
|
||||
cleared=no eat=no
|
||||
for arg
|
||||
do
|
||||
case $cleared in
|
||||
no)
|
||||
set ""; shift
|
||||
cleared=yes ;;
|
||||
esac
|
||||
if test $eat = yes; then
|
||||
eat=no
|
||||
continue
|
||||
fi
|
||||
case "$arg" in
|
||||
-D*|-I*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
# Strip any option that makedepend may not understand. Remove
|
||||
# the object too, otherwise makedepend will parse it as a source file.
|
||||
-arch)
|
||||
eat=yes ;;
|
||||
-*|$object)
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
esac
|
||||
done
|
||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||
touch "$tmpdepfile"
|
||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||
rm -f "$depfile"
|
||||
# makedepend may prepend the VPATH from the source file name to the object.
|
||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed '1,2d' "$tmpdepfile" \
|
||||
| tr ' ' "$nl" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
cpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E \
|
||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvisualcpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case "$arg" in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E 2>/dev/null |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||
echo "$tab" >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvcmsys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
none)
|
||||
exec "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown depmode $depmode" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
|
@ -0,0 +1,508 @@
|
|||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2014-09-12.12; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# 'make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
tab=' '
|
||||
nl='
|
||||
'
|
||||
IFS=" $tab$nl"
|
||||
|
||||
# Set DOITPROG to "echo" to test this script.
|
||||
|
||||
doit=${DOITPROG-}
|
||||
doit_exec=${doit:-exec}
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
is_target_a_directory=possibly
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-t)
|
||||
is_target_a_directory=always
|
||||
dst_arg=$2
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) is_target_a_directory=never;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# We allow the use of options -d and -T together, by making -d
|
||||
# take the precedence; this is for compatibility with GNU install.
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
if test -n "$dst_arg"; then
|
||||
echo "$0: target directory not allowed when installing a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call 'install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||
if test ! -d "$dst_arg"; then
|
||||
echo "$0: $dst_arg: Is not a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test "$is_target_a_directory" = never; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dst=$dstdir/`basename "$src"`
|
||||
dstdir_status=0
|
||||
else
|
||||
dstdir=`dirname "$dst"`
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||
umask=`umask`
|
||||
case $stripcmd.$umask in
|
||||
# Optimize common cases.
|
||||
*[2367][2367]) mkdir_umask=$umask;;
|
||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
mkdir_umask=`expr $umask + 22 \
|
||||
- $umask % 100 % 40 + $umask % 20 \
|
||||
- $umask % 10 % 4 + $umask % 2
|
||||
`;;
|
||||
*) mkdir_umask=$umask,go-w;;
|
||||
esac
|
||||
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
case $umask in
|
||||
*[123567][0-7][0-7])
|
||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||
;;
|
||||
*)
|
||||
# $RANDOM is not portable (e.g. dash); use it when possible to
|
||||
# lower collision chance
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||
|
||||
# As "mkdir -p" follows symlinks and we work in /tmp possibly; so
|
||||
# create the $tmpdir first (and fail if unsuccessful) to make sure
|
||||
# that nobody tries to guess the $tmpdir name.
|
||||
if (umask $mkdir_umask &&
|
||||
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
test_tmpdir="$tmpdir/a"
|
||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask=$mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
set +f &&
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
|
@ -0,0 +1,743 @@
|
|||
/*
|
||||
* Intel CPU Microcode data manipulation
|
||||
*
|
||||
* Copyright (c) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
* 2010-2018 Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||
*
|
||||
* Based on Linux kernel Intel Microcode driver v2.6.36-rc3 (1.14)
|
||||
* Based on Linux microcode.ctl version 1.17
|
||||
*
|
||||
* Reference: Section 9.11 of Volume 3a, IA-32 Intel Architecture
|
||||
* Software Developer's Manual
|
||||
* Order Number 253668 or free download from:
|
||||
* http://developer.intel.com/design/pentium4/manuals/253668.htm
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include "intel_microcode.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* For micro-optimization on the hotter paths
|
||||
*/
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
/* pointer alignment test */
|
||||
#define IS_PTR_ALIGNED(p, a) (!!(((uintptr_t)p & ((uintptr_t)(a)-1)) == 0))
|
||||
|
||||
/*
|
||||
* Microcode update file data structures
|
||||
*/
|
||||
|
||||
/*
|
||||
* Microcode bundle layout, version 1:
|
||||
*
|
||||
* sequence of one or more intel_ucode_v1_get_totalsize() bytes:
|
||||
* struct intel_ucode_v1_hdr (48 bytes)
|
||||
* uint32_t data[] (intel_ucode_v1_get_datasize() bytes)
|
||||
* struct intel_ucode_v1_extsig_table (optional, size varies)
|
||||
*
|
||||
* The total size will always be a multiple of 1024 bytes and is
|
||||
* composed of all three of the above structures.
|
||||
*/
|
||||
|
||||
struct intel_ucode_v1_hdr { /* 48 bytes */
|
||||
uint32_t hdrver; /* must be 0x1 */
|
||||
int32_t rev; /* yes, it IS signed */
|
||||
uint32_t date; /* packed BCD, MMDDYYYY */
|
||||
uint32_t sig;
|
||||
uint32_t cksum;
|
||||
uint32_t ldrver;
|
||||
uint32_t pf_mask;
|
||||
uint32_t datasize; /* 0 means 2000 */
|
||||
uint32_t totalsize; /* 0 means 2048 */
|
||||
uint32_t reserved[3];
|
||||
} __attribute__((packed));
|
||||
|
||||
/* microcode format is extended from prescott processors */
|
||||
struct intel_ucode_v1_extsig {
|
||||
uint32_t sig;
|
||||
uint32_t pf_mask;
|
||||
uint32_t cksum;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct intel_ucode_v1_extsig_table {
|
||||
uint32_t count; /* number of entries in sigs[] */
|
||||
uint32_t cksum;
|
||||
uint32_t reserved[3];
|
||||
struct intel_ucode_v1_extsig sigs[];
|
||||
} __attribute__((packed));
|
||||
|
||||
#define INTEL_UC_V1_DEF_DATASIZE (2000)
|
||||
#define INTEL_UC_V1_HEADER_SIZE (sizeof(struct intel_ucode_v1_hdr))
|
||||
#define INTEL_UC_V1_DEF_TOTALSIZE (INTEL_UC_V1_DEF_DATASIZE + \
|
||||
INTEL_UC_V1_HEADER_SIZE)
|
||||
#define INTEL_UC_V1_EXTHDR_SIZE (sizeof(struct intel_ucode_v1_extsig_table))
|
||||
#define INTEL_UC_V1_EXTSIG_SIZE (sizeof(struct intel_ucode_v1_extsig))
|
||||
|
||||
#define intel_uc_v1_exttable_size(et) \
|
||||
((et)->count * INTEL_UC_V1_EXTSIG_SIZE + INTEL_UC_V1_EXTHDR_SIZE)
|
||||
|
||||
/**
|
||||
* is_valid_bcd() - validate 8-digit packed BCD
|
||||
* @data: 32-bit integer with the 8-digit packet BCD number
|
||||
*
|
||||
* Check validity of an 8-digit packed BCD (ensure all digits are
|
||||
* between 0 and 9).
|
||||
*
|
||||
* Returns zero if invalid, and non-zero otherwise.
|
||||
*/
|
||||
static inline int is_valid_bcd(const uint32_t data)
|
||||
{
|
||||
/* use arcane bit magic to test lower 7 digits just for fun,
|
||||
* try to figure it out when you're feeling bored. */
|
||||
return (data < 0xA0000000U) &&
|
||||
((((data + 0x06666666U) ^ data) & 0x11111110U) == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_v1_get_totalsize() - get total size of a microcode entry
|
||||
*
|
||||
* @hdr: pointer to the start of the microcode entry (header)
|
||||
*
|
||||
* Returns the total size of a single microcode entry. The microcode
|
||||
* data file is composed of one or more microcode entries, stored
|
||||
* back-to-back.
|
||||
*
|
||||
* The total size includes the header, microcode data, and the optional
|
||||
* extended signature table.
|
||||
*/
|
||||
static inline uint32_t intel_ucode_v1_get_totalsize(const struct intel_ucode_v1_hdr * const hdr)
|
||||
{
|
||||
/* totalsize is valid only if datasize != 0, IA SDM 9.11.1, page 9-28 */
|
||||
if (hdr->datasize != 0)
|
||||
return hdr->totalsize;
|
||||
else
|
||||
return INTEL_UC_V1_DEF_TOTALSIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_v1_get_datasize() - get microcode data size of a microcode entry
|
||||
*
|
||||
* @hdr: pointer to the start of the microcode entry (header)
|
||||
*
|
||||
* Returns the size of the opaque data field of a single microcode entry.
|
||||
*/
|
||||
static inline uint32_t intel_ucode_v1_get_datasize(const struct intel_ucode_v1_hdr * const hdr)
|
||||
{
|
||||
if (hdr->datasize != 0)
|
||||
return hdr->datasize;
|
||||
else
|
||||
return INTEL_UC_V1_DEF_DATASIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_getmetadata() - extract metadata from microcode
|
||||
* @uc: microcode
|
||||
* @metadata: pointer to struct intel_ucode_metadata to be filled with
|
||||
*
|
||||
* Fills @metadata with metadata from microcode @uc. @uc must already have
|
||||
* been validated.
|
||||
*/
|
||||
intel_ucode_status_t intel_ucode_getmetadata(const void * const uc,
|
||||
struct intel_ucode_metadata * const metadata)
|
||||
{
|
||||
const struct intel_ucode_v1_hdr * const hdr = uc;
|
||||
|
||||
if (unlikely(!hdr || !metadata))
|
||||
return INTEL_UCODE_BAD_PARAMETERS;
|
||||
|
||||
if (unlikely(hdr->hdrver != 1))
|
||||
return INTEL_UCODE_UNKNOWN_FORMAT;
|
||||
|
||||
metadata->date_year = hdr->date & 0xffffU;
|
||||
metadata->date_day = hdr->date >> 16 & 0xffU;
|
||||
metadata->date_month = hdr->date >> 24 & 0xffU;
|
||||
metadata->revision = hdr->rev;
|
||||
|
||||
metadata->extsig_count = 0;
|
||||
if (hdr->datasize) {
|
||||
metadata->size = hdr->totalsize;
|
||||
|
||||
if (unlikely(hdr->totalsize > INTEL_UC_V1_HEADER_SIZE + hdr->datasize)) {
|
||||
const struct intel_ucode_v1_extsig_table * const ext_header =
|
||||
(const void *)((const uint8_t *)uc + INTEL_UC_V1_HEADER_SIZE + hdr->datasize);
|
||||
metadata->extsig_count = ext_header->count;
|
||||
}
|
||||
} else {
|
||||
metadata->size = INTEL_UC_V1_DEF_TOTALSIZE;
|
||||
}
|
||||
|
||||
return INTEL_UCODE_NOERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_getdate_bcd() - extract microcode date
|
||||
* @uc: microcode
|
||||
*
|
||||
* Returns the microcode date, in packed BCD (YYYYMMDD) format.
|
||||
* The date is not normalized, but it will be valid packed BCD.
|
||||
*
|
||||
* Call this function only on microcode entries that have been
|
||||
* verified to be well-formed by intel_ucode_check_microcode().
|
||||
*
|
||||
* Returns zero in case of error.
|
||||
*/
|
||||
uint32_t intel_ucode_getdate_bcd(const void * const uc)
|
||||
{
|
||||
const struct intel_ucode_v1_hdr * const hdr = uc;
|
||||
|
||||
if (unlikely(!hdr || hdr->hdrver != 1))
|
||||
return 0;
|
||||
|
||||
if (unlikely(!is_valid_bcd(hdr->date)))
|
||||
return 0;
|
||||
|
||||
/* v1 ucode date field is in MMDDYYYY format */
|
||||
return ((hdr->date & 0xffffU) << 16) |
|
||||
((hdr->date >> 16) & 0xffffU);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_compare() - compares two microcodes
|
||||
*
|
||||
* @uc1, @uc2: pointer to start of microcode entries to compare
|
||||
*
|
||||
* Checks if the two microcode entries are compatible, i.e. they
|
||||
* differ at most on their pf masks. Compatible microcode entries can
|
||||
* be merged into a single entry by ORing their pf masks.
|
||||
*
|
||||
* Extended signature tables are not supported. If any of the
|
||||
* microcode entries has one, the function will return a mismatch.
|
||||
*
|
||||
* Call this function only on microcode entries that have been
|
||||
* verified to be well-formed by intel_ucode_check_microcode().
|
||||
*
|
||||
* Returns:
|
||||
* -EINVAL: parameter problem
|
||||
* -EBADF: two copies of the same microcode, with different opaque data
|
||||
* 0: the two microcodes are incompatible
|
||||
* 1: the two microcodes are compatible
|
||||
* 2: the two microcodes are identical
|
||||
*/
|
||||
int intel_ucode_compare(const void * const uc1, const void * const uc2)
|
||||
{
|
||||
const struct intel_ucode_v1_hdr * const hdr1 = uc1;
|
||||
const struct intel_ucode_v1_hdr * const hdr2 = uc2;
|
||||
unsigned long int ts1, ts2, ds1, ds2;
|
||||
|
||||
if (unlikely(!uc1 || !uc2))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely((hdr1->hdrver != 1) || (hdr2->hdrver != 1)))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(uc1 == uc2))
|
||||
return 2;
|
||||
|
||||
ts1 = intel_ucode_v1_get_totalsize(hdr1);
|
||||
ts2 = intel_ucode_v1_get_totalsize(hdr2);
|
||||
if (ts1 != ts2)
|
||||
return 0;
|
||||
|
||||
ds1 = intel_ucode_v1_get_datasize(hdr1);
|
||||
ds2 = intel_ucode_v1_get_datasize(hdr2);
|
||||
if (ds1 != ds2)
|
||||
return 0;
|
||||
|
||||
if (ds1 + INTEL_UC_V1_HEADER_SIZE < ts1)
|
||||
return 0; /* uc1,2 have extended header */
|
||||
|
||||
if (hdr1->sig != hdr2->sig || hdr1->rev != hdr2->rev)
|
||||
return 0;
|
||||
|
||||
if (memcmp((const uint8_t *)uc1 + INTEL_UC_V1_HEADER_SIZE,
|
||||
(const uint8_t *)uc2 + INTEL_UC_V1_HEADER_SIZE, ds1))
|
||||
return (hdr1->pf_mask & hdr2->pf_mask)? -EBADF: 0;
|
||||
|
||||
/*
|
||||
* we *really* don't want different microcodes with the same
|
||||
* rev number and signature, but we don't care if they're the
|
||||
* same but have different dates.
|
||||
*/
|
||||
|
||||
return (hdr1->date == hdr2->date &&
|
||||
hdr1->pf_mask == hdr2->pf_mask)? 2 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_errstr - converts intel_ucode_status_t to string
|
||||
*
|
||||
* @status: intel_ucode_status_t value to convert
|
||||
*
|
||||
* Returns a human-readable string explaining a intel_ucode_status_t
|
||||
* status code. The string is static allocated, NULL-terminated,
|
||||
* and in English.
|
||||
*/
|
||||
const char * intel_ucode_errstr(const intel_ucode_status_t status)
|
||||
{
|
||||
/* warning: this is an __attribute__((const)) function! */
|
||||
switch (status) {
|
||||
case INTEL_UCODE_INVALID_DATA:
|
||||
return "invalid microcode data";
|
||||
case INTEL_UCODE_UNKNOWN_FORMAT:
|
||||
return "unknown microcode format";
|
||||
case INTEL_UCODE_BAD_EXTENDED_TABLE:
|
||||
return "bad extended signature table";
|
||||
case INTEL_UCODE_BAD_EXTENDED_TABLE_CHECKSUM:
|
||||
return "incorrect extended signature table checksum";
|
||||
case INTEL_UCODE_BAD_CHECKSUM:
|
||||
return "incorrect microcode checksum";
|
||||
case INTEL_UCODE_BAD_EXTENDED_SIG_CHECKSUM:
|
||||
return "incorrect extended signature checksum";
|
||||
case INTEL_UCODE_COUNTEROVERFLOW:
|
||||
return "too many microcodes or signatures to handle";
|
||||
case INTEL_UCODE_CALLBACK_ERROR:
|
||||
return "callback returned failure status";
|
||||
case INTEL_UCODE_NOERROR:
|
||||
return "success";
|
||||
case INTEL_UCODE_BAD_PARAMETERS:
|
||||
return "internal error: bad parameters passed to function";
|
||||
default:
|
||||
return "internal error: invalid intel_ucode_status_t status";
|
||||
}
|
||||
}
|
||||
|
||||
static int is_zero_checksum(const uint8_t *data, uint32_t dwords)
|
||||
{
|
||||
uint32_t s = 0;
|
||||
|
||||
/*
|
||||
* Test using -tr loader on a valid microcode data file with one to
|
||||
* three bytes of zeros prepended (to offset the valid microcode
|
||||
* data out of alignment).
|
||||
*/
|
||||
|
||||
if (IS_PTR_ALIGNED(data, sizeof(uint32_t))) {
|
||||
/*
|
||||
* gcc might generate vectorized code that cannot handle
|
||||
* unaligned pointer dereferences when given this pattern:
|
||||
*/
|
||||
const uint32_t *p = (const uint32_t *)data;
|
||||
while (dwords--)
|
||||
s += *(p++);
|
||||
} else {
|
||||
/*
|
||||
* Avoid unaligned accesses. gcc seems to always vectorize
|
||||
* this properly into code that can handle unaligned data.
|
||||
* When not vectorized, generates slow code.
|
||||
*
|
||||
* Note:
|
||||
* s += (((uint16_t *)data)[0] | (((uint16_t *)data)[1] << 16));
|
||||
*
|
||||
* also works when vectorized by gcc, and generates faster
|
||||
* and better code than doing it one byte at a time like
|
||||
* below. However, when working around compiler issues, it
|
||||
* often pays off to go all the way...
|
||||
*/
|
||||
while (dwords--) {
|
||||
s += ((unsigned int)data[0] |
|
||||
((unsigned int)data[1] << 8) |
|
||||
((unsigned int)data[2] << 16) |
|
||||
((unsigned int)data[3] << 24));
|
||||
data += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return (s == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* xx_intel_ucode_check_uc()
|
||||
*
|
||||
* refer to intel_ucode_check_microcode() for details.
|
||||
*
|
||||
* @uc does not have to be aligned.
|
||||
*
|
||||
* We depend on the fact that x86/x86-64 is fine with misaligned data
|
||||
* access, as long as you keep away from aligned vector instructions and
|
||||
* other "specials".
|
||||
*/
|
||||
static intel_ucode_status_t xx_intel_ucode_check_uc(const void * const uc,
|
||||
const size_t maxlen,
|
||||
const int strict)
|
||||
{
|
||||
unsigned long int total_size, data_size, ext_table_size;
|
||||
const struct intel_ucode_v1_hdr * const uc_header = uc;
|
||||
unsigned int i;
|
||||
|
||||
if (unlikely(!uc || (strict && !IS_PTR_ALIGNED(uc, sizeof(uint32_t)))))
|
||||
return INTEL_UCODE_BAD_PARAMETERS;
|
||||
|
||||
if (unlikely(maxlen < INTEL_UC_MINSIZE))
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (unlikely(uc_header->hdrver != 1))
|
||||
return INTEL_UCODE_UNKNOWN_FORMAT;
|
||||
|
||||
/* Header version 1 format */
|
||||
|
||||
total_size = intel_ucode_v1_get_totalsize(uc_header);
|
||||
data_size = intel_ucode_v1_get_datasize(uc_header);
|
||||
|
||||
if (data_size > total_size || data_size < INTEL_UC_V1_HEADER_SIZE)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
if (data_size + INTEL_UC_V1_HEADER_SIZE > total_size)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (data_size % sizeof(uint32_t))
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
if (total_size % sizeof(uint32_t))
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
if (strict && total_size % 1024)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
if (total_size > maxlen)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
/* Calculate the checksum. We exclude the extended table as it
|
||||
* also has to have a zero checksum, in order to get better
|
||||
* coverage */
|
||||
if (!is_zero_checksum(uc, (INTEL_UC_V1_HEADER_SIZE + data_size) / sizeof(uint32_t)))
|
||||
return INTEL_UCODE_BAD_CHECKSUM; /* invalid checksum */
|
||||
|
||||
/* we can now assume that this is very likely to be microcode */
|
||||
|
||||
ext_table_size = total_size - (INTEL_UC_V1_HEADER_SIZE + data_size);
|
||||
if (unlikely(ext_table_size)) {
|
||||
const struct intel_ucode_v1_extsig_table *ext_header;
|
||||
const struct intel_ucode_v1_extsig *ext_sig;
|
||||
uint32_t ext_sigcount;
|
||||
|
||||
if (ext_table_size < INTEL_UC_V1_EXTHDR_SIZE)
|
||||
return INTEL_UCODE_BAD_EXTENDED_TABLE; /* exttable size too small */
|
||||
if ((ext_table_size - INTEL_UC_V1_EXTHDR_SIZE) % INTEL_UC_V1_EXTSIG_SIZE)
|
||||
return INTEL_UCODE_BAD_EXTENDED_TABLE; /* bad exttable size */
|
||||
|
||||
ext_header = (const void *)((const uint8_t *)uc + INTEL_UC_V1_HEADER_SIZE + data_size);
|
||||
if (ext_table_size != intel_uc_v1_exttable_size(ext_header))
|
||||
return INTEL_UCODE_BAD_EXTENDED_TABLE; /* bad exttable size */
|
||||
|
||||
/* extended table checksum */
|
||||
if (!is_zero_checksum((const uint8_t *)ext_header, ext_table_size / sizeof(uint32_t)))
|
||||
return INTEL_UCODE_BAD_EXTENDED_TABLE_CHECKSUM; /* invalid checksum */
|
||||
|
||||
ext_sigcount = ext_header->count;
|
||||
|
||||
/* check checksum of each extended signature */
|
||||
ext_sig = (const void *)((const uint8_t *)ext_header + INTEL_UC_V1_EXTHDR_SIZE);
|
||||
i = ext_sigcount;
|
||||
while (i--) {
|
||||
uint32_t sum = (ext_sig->sig + ext_sig->pf_mask + ext_sig->cksum) -
|
||||
(uc_header->sig + uc_header->pf_mask + uc_header->cksum);
|
||||
if (sum)
|
||||
return INTEL_UCODE_BAD_EXTENDED_SIG_CHECKSUM; /* invalid checksum */
|
||||
ext_sig++;
|
||||
}
|
||||
}
|
||||
|
||||
/* misc sanity checks */
|
||||
if (unlikely(!uc_header->date)) /* missing date, breaks filtering */
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (unlikely(strict && !uc_header->rev)) /* illegal revision */
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (unlikely(strict && (
|
||||
!is_valid_bcd(uc_header->date) || (uc_header->date & 0xffffU) < 0x1995U ||
|
||||
!(uc_header->date >> 16 & 0xffU) || (uc_header->date >> 16 & 0xffU) > 0x31U ||
|
||||
!(uc_header->date >> 24 & 0xffU) || (uc_header->date >> 24 & 0xffU) > 0x12U )))
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
return INTEL_UCODE_NOERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_check_microcode() - perform sanity checks on a microcode entry
|
||||
*
|
||||
* @uc: pointer to the beginning of a microcode entry
|
||||
* @strict: if non-zero, perform more strict checking
|
||||
* @maxlen: memory buffer size (limit microcode entry to maxlen bytes)
|
||||
*
|
||||
* This function checks the well-formedness and sanity of a microcode entry.
|
||||
* All other functions in the library expect to receive sane and well-formed
|
||||
* microcode headers and full microcode entries, so this function MUST be
|
||||
* used beforehand.
|
||||
*
|
||||
* @uc must be correctly aligned to a 4-byte boundary.
|
||||
*
|
||||
* In strict mode, secondary checks such as size constraints are applied
|
||||
* which will help weed off almost-correct data. This DID flag some weird
|
||||
* microcode for signature 0x106c0, present in one of the microcode files
|
||||
* distributed by urbanmyth.org in 2008 (apparently it was microcode for
|
||||
* an engineering stepping of an Atom processor).
|
||||
*
|
||||
* Returns INTEL_UCODE_NOERROR if the microcode entry looks sane, or a
|
||||
* different status code indicating a problem with the microcode entry.
|
||||
*/
|
||||
intel_ucode_status_t intel_ucode_check_microcode(const void * const uc,
|
||||
const size_t maxlen,
|
||||
const int strict)
|
||||
{
|
||||
if (unlikely(!uc || !IS_PTR_ALIGNED(uc, sizeof(uint32_t))))
|
||||
return INTEL_UCODE_BAD_PARAMETERS;
|
||||
|
||||
return xx_intel_ucode_check_uc(uc, maxlen, strict);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_scan_for_microcode() - scan for valid microcode
|
||||
*
|
||||
* @bs: pointer to a pointer to the memory area to scan for valid
|
||||
* microcode. Modified on return to point to the start of the
|
||||
* area with valid microcode
|
||||
* @be: Modified on return to point to the first byte past the end
|
||||
* of the area with valid microcode
|
||||
* @blen: Modified on return to be the size of the microcode area
|
||||
* @alen: size of the memory area to search. Modified on return
|
||||
* to account for the bytes that have been already searched
|
||||
* (i.e. @bs delta plus @blen).
|
||||
*
|
||||
* This function searches for the first well-formed microcode entry in the
|
||||
* memory area starting at @bs, with a length of @alen. Then, it validates
|
||||
* all microcodes in that memory area that are stored back-to-back (up to
|
||||
* INT_MAX microcodes), and updates @bs to point to the start of the first
|
||||
* microcode. It sets @be to point to the byte after the last microcode
|
||||
* and @blen to the size of the microcode block, and updates @alen to
|
||||
* account for all data already read from the memory area.
|
||||
*
|
||||
* Returns the number of microcodes found (can be zero), or a
|
||||
* negative error number:
|
||||
*
|
||||
* -EINVAL: Invalid function parameters
|
||||
* -EFAULT: Internal error (counter/pointer under/overflow)
|
||||
*
|
||||
* It searches for valid microcode using intel_ucode_check_microcode()
|
||||
* in non-strict mode.
|
||||
*
|
||||
* There are no alignment requirements on @bs or on the start position of
|
||||
* the first microcode inside the memory area. @bs and @be are pointers
|
||||
* to a byte-aligned memory area (i.e. char* / uint8_t*).
|
||||
*
|
||||
* The resulting microcode area, if one is found, MIGHT BE UNALIGNED, IN
|
||||
* WHICH CASE IT MUST BE COPIED/MOVED TO A 4-BYTE ALIGNED BUFFER BEFORE USE.
|
||||
*/
|
||||
int intel_ucode_scan_for_microcode(const void ** const bs, const void ** const be,
|
||||
size_t * const blen, size_t * const alen)
|
||||
{
|
||||
intel_ucode_status_t r = INTEL_UCODE_INVALID_DATA;
|
||||
const uint8_t *p, *q;
|
||||
size_t bl, al, cnt_max;
|
||||
int uc_cnt;
|
||||
|
||||
if (!bs || !be || !blen || !alen)
|
||||
return -EINVAL;
|
||||
|
||||
al = *alen;
|
||||
cnt_max = al;
|
||||
p = *bs;
|
||||
|
||||
/* NOTE: update only at success exit path */
|
||||
*blen = 0;
|
||||
*be = p;
|
||||
|
||||
/* find first microcode */
|
||||
while (al >= INTEL_UC_MINSIZE) {
|
||||
q = memchr(p, 0x01, al); /* search for a v1 header, which starts with 0x01 */
|
||||
if (!q) {
|
||||
/* not found */
|
||||
*be = *(const uint8_t **)bs + *alen;
|
||||
*alen = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* successful memchr() ensures q >= p, and (q-p) < al */
|
||||
al -= (size_t)(q - p);
|
||||
if (unlikely(!al || al > cnt_max))
|
||||
goto paranoia_out;
|
||||
|
||||
p = q;
|
||||
r = xx_intel_ucode_check_uc(p, al, 0);
|
||||
if (r == INTEL_UCODE_NOERROR)
|
||||
break;
|
||||
|
||||
p++;
|
||||
al--;
|
||||
}
|
||||
|
||||
if (r != INTEL_UCODE_NOERROR)
|
||||
return 0;
|
||||
|
||||
*bs = p;
|
||||
|
||||
/* find size of the continuous area */
|
||||
bl = 0;
|
||||
uc_cnt = 0;
|
||||
cnt_max = al;
|
||||
do {
|
||||
const struct intel_ucode_v1_hdr * const uch = (const void *)p;
|
||||
const unsigned long int total_size = intel_ucode_v1_get_totalsize(uch);
|
||||
p += total_size;
|
||||
bl += total_size;
|
||||
al -= total_size;
|
||||
uc_cnt++;
|
||||
|
||||
if (unlikely(al > cnt_max || bl > cnt_max))
|
||||
goto paranoia_out;
|
||||
|
||||
r = xx_intel_ucode_check_uc(p, al, 0);
|
||||
} while (uc_cnt < INT_MAX && r == INTEL_UCODE_NOERROR);
|
||||
|
||||
*be = p;
|
||||
*blen = bl;
|
||||
*alen = al;
|
||||
return uc_cnt;
|
||||
|
||||
paranoia_out:
|
||||
/* Hardening against programming errors that could cause counter
|
||||
* under/overflow or buffer overflow */
|
||||
*bs = *be;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_foreach_signature() - run callback for every signature
|
||||
*
|
||||
* @uc: pointer to the microcode entry
|
||||
* @action: callback of type intel_ucode_sig_callback
|
||||
* @userdata: opaque pointer passed to callback
|
||||
*
|
||||
* Call the @action callback for each signature in the microcode entry,
|
||||
* including any optional extended signatures.
|
||||
*
|
||||
* Do NOT run this function on microcode that was not verified to be
|
||||
* correct by intel_ucode_check_microcode().
|
||||
*
|
||||
* @uc must be correctly aligned to a 4-byte boundary.
|
||||
*/
|
||||
intel_ucode_status_t intel_ucode_foreach_signature(const void * const uc,
|
||||
intel_ucode_sig_callback * const action,
|
||||
void * const userdata)
|
||||
{
|
||||
const struct intel_ucode_v1_hdr * const uc_header = uc;
|
||||
const void *uc_data;
|
||||
unsigned int total_size, data_size, ext_table_size;
|
||||
|
||||
if (!action || !uc || !IS_PTR_ALIGNED(uc, sizeof(uint32_t)))
|
||||
return INTEL_UCODE_BAD_PARAMETERS;
|
||||
|
||||
if (uc_header->hdrver != 1)
|
||||
return INTEL_UCODE_UNKNOWN_FORMAT;
|
||||
|
||||
/* Header version 1 format */
|
||||
|
||||
uc_data = (const uint8_t *)uc + INTEL_UC_V1_HEADER_SIZE;
|
||||
|
||||
total_size = intel_ucode_v1_get_totalsize(uc_header);
|
||||
data_size = intel_ucode_v1_get_datasize(uc_header);
|
||||
|
||||
/* Process first signature (from header) */
|
||||
if (action(userdata, 0,
|
||||
uc_header->sig, uc_header->pf_mask,
|
||||
uc_data, data_size, uc, total_size))
|
||||
return INTEL_UCODE_CALLBACK_ERROR;
|
||||
|
||||
ext_table_size = total_size - (INTEL_UC_V1_HEADER_SIZE + data_size);
|
||||
if (ext_table_size) {
|
||||
const struct intel_ucode_v1_extsig_table *ext_header;
|
||||
const struct intel_ucode_v1_extsig *ext_sig;
|
||||
uint32_t ext_sigcount;
|
||||
|
||||
uint32_t i;
|
||||
|
||||
ext_header = (const void *)((const uint8_t *)uc + INTEL_UC_V1_HEADER_SIZE + data_size);
|
||||
ext_sig = (const void *)((const uint8_t *)ext_header + INTEL_UC_V1_EXTHDR_SIZE);
|
||||
ext_sigcount = ext_header->count;
|
||||
for (i = 1; i <= ext_sigcount; i++) {
|
||||
if (action(userdata, i,
|
||||
ext_sig->sig, ext_sig->pf_mask,
|
||||
uc_data, data_size, uc, total_size))
|
||||
return INTEL_UCODE_CALLBACK_ERROR;
|
||||
ext_sig++;
|
||||
}
|
||||
}
|
||||
|
||||
return INTEL_UCODE_NOERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_ucode_foreach_microcode() - run callback for every microcode entry
|
||||
*
|
||||
* @uc_bundle: bundle of microcodes
|
||||
* @uc_bundle_size: size of the microcode bundle in bytes
|
||||
* @action: callback of type intel_ucode_mc_callback
|
||||
* @userdata: opaque pointer passed to callback
|
||||
*
|
||||
* Call the @action callback for each microcode in the microcode entry.
|
||||
*
|
||||
* Note that it is very likely that the callback will HAVE to call
|
||||
* intel_ucode_check_microcode() to check each microcode, and return
|
||||
* non-zero should it be faulty, otherwise nasty things can happen.
|
||||
*
|
||||
* A version 1 microcode bundle is a series of microcode entries, one
|
||||
* after the other, without any sort of padding.
|
||||
*
|
||||
* @uc_bundle must be correctly aligned to a 4-byte boundary.
|
||||
*/
|
||||
intel_ucode_status_t intel_ucode_foreach_microcode(
|
||||
const void * const uc_bundle,
|
||||
const size_t uc_bundle_size,
|
||||
intel_ucode_uc_callback * const action,
|
||||
void * const userdata)
|
||||
{
|
||||
const uint8_t *uc = uc_bundle;
|
||||
size_t leftover = uc_bundle_size;
|
||||
unsigned int uc_count;
|
||||
|
||||
if (!action || !uc || !IS_PTR_ALIGNED(uc, sizeof(uint32_t)))
|
||||
return INTEL_UCODE_BAD_PARAMETERS;
|
||||
|
||||
/* try to guess bundle version */
|
||||
if (uc_bundle_size < INTEL_UC_MINSIZE)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (((const struct intel_ucode_v1_hdr *)uc)->hdrver != 1)
|
||||
return INTEL_UCODE_UNKNOWN_FORMAT;
|
||||
|
||||
/* bundle of version 0x1 microcodes */
|
||||
|
||||
uc_count = 0;
|
||||
while (leftover) {
|
||||
unsigned int uc_size;
|
||||
|
||||
if (leftover < INTEL_UC_V1_HEADER_SIZE)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
uc_count++;
|
||||
if (!uc_count)
|
||||
return INTEL_UCODE_COUNTEROVERFLOW;
|
||||
|
||||
uc_size = intel_ucode_v1_get_totalsize((const struct intel_ucode_v1_hdr *)uc);
|
||||
if (uc_size % sizeof(uint32_t) || uc_size > leftover)
|
||||
return INTEL_UCODE_INVALID_DATA;
|
||||
|
||||
if (action(userdata, uc_count, uc, leftover))
|
||||
return INTEL_UCODE_CALLBACK_ERROR;
|
||||
|
||||
uc += uc_size;
|
||||
leftover -= uc_size;
|
||||
}
|
||||
|
||||
return INTEL_UCODE_NOERROR;
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
* Intel CPU Microcode data manipulation
|
||||
*
|
||||
* Copyright (c) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
* 2010-2018 Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||
*
|
||||
* Based on Linux kernel Intel Microcode driver v2.6.36-rc3 (1.14)
|
||||
* Based on Linux microcode.ctl version 1.17
|
||||
*
|
||||
* Reference: Section 9.11 of Volume 3a, IA-32 Intel Architecture
|
||||
* Software Developer's Manual
|
||||
* Order Number 253668 or free download from:
|
||||
* http://developer.intel.com/design/pentium4/manuals/253668.htm
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef INTEL_MICROCODE_H
|
||||
#define INTEL_MICROCODE_H
|
||||
|
||||
#include "iucode_tool_config.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Minimum object size that could have a valid production microcode */
|
||||
#define INTEL_UC_MINSIZE 1024
|
||||
|
||||
typedef enum { /* status result codes */
|
||||
INTEL_UCODE_NOERROR = 0,
|
||||
INTEL_UCODE_BAD_PARAMETERS,
|
||||
INTEL_UCODE_INVALID_DATA,
|
||||
INTEL_UCODE_UNKNOWN_FORMAT,
|
||||
/* only returned by intel_ucode_check_microcode() */
|
||||
INTEL_UCODE_BAD_EXTENDED_TABLE,
|
||||
INTEL_UCODE_BAD_EXTENDED_TABLE_CHECKSUM,
|
||||
INTEL_UCODE_BAD_EXTENDED_SIG_CHECKSUM,
|
||||
INTEL_UCODE_BAD_CHECKSUM,
|
||||
/* only returned by the foreach functions */
|
||||
INTEL_UCODE_CALLBACK_ERROR,
|
||||
INTEL_UCODE_COUNTEROVERFLOW,
|
||||
} intel_ucode_status_t;
|
||||
|
||||
struct intel_ucode_metadata {
|
||||
uint16_t date_year; /* 4-bit packed BCD format */
|
||||
uint8_t date_day; /* 4-bit packed BCD format */
|
||||
uint8_t date_month; /* 4-bit packed BCD format */
|
||||
int32_t revision;
|
||||
uint32_t size;
|
||||
uint32_t extsig_count;
|
||||
};
|
||||
|
||||
intel_ucode_status_t intel_ucode_getmetadata(const void * const uc,
|
||||
struct intel_ucode_metadata * const metadata);
|
||||
|
||||
uint32_t intel_ucode_getdate_bcd(const void * const uc);
|
||||
|
||||
/**
|
||||
* intel_ucode_sigmatch() - match signature against processor signature
|
||||
*
|
||||
* @s1: CPUID 0x01, EAX
|
||||
* @s2: microcode signature/extended signature "sig" field
|
||||
* @p1: 1 << (MSR IA32_PLATFORM_ID[52:50])
|
||||
* @p2: microcode signature/extended signature "pf" mask
|
||||
*
|
||||
* Returns true if the microcode can be used in a given processor.
|
||||
*
|
||||
* The kernel driver exports through sysfs the processor flags already
|
||||
* in the format expected by this macro.
|
||||
*/
|
||||
#define intel_ucode_sigmatch(s1, s2, p1, p2) \
|
||||
(((s1) == (s2)) && (((p1) & (p2)) || (((p1) == 0) && ((p2) == 0))))
|
||||
|
||||
const char * intel_ucode_errstr(const intel_ucode_status_t status) __attribute__((const));
|
||||
|
||||
intel_ucode_status_t intel_ucode_check_microcode(const void * const uc,
|
||||
const size_t maxlen,
|
||||
const int strict);
|
||||
|
||||
int intel_ucode_compare(const void * const uc1, const void * const uc2);
|
||||
|
||||
int intel_ucode_scan_for_microcode(const void ** const bs,
|
||||
const void ** const be,
|
||||
size_t * const blen,
|
||||
size_t * const alen);
|
||||
|
||||
/* Iterators */
|
||||
|
||||
/**
|
||||
* intel_ucode_sig_callback() - callback function for the
|
||||
* intel_ucode_foreach_microcode() function
|
||||
*
|
||||
* @userdata: pointer as passed to intel_ucode_foreach_microcode()
|
||||
* @uc_count: one-based counter of microcode entries
|
||||
* @uc: pointer to start of microcode entry
|
||||
* @uc_max_size: maximum bound for microcode entry size
|
||||
*
|
||||
* @uc is a pointer to somewhere inside the original bundle passed to
|
||||
* intel_ucode_foreach_microcode(), where a microcode entry starts.
|
||||
* DO NOT MODIFY the memory area pointed by @uc.
|
||||
*
|
||||
* Note that it is very likely that the callback will HAVE to call
|
||||
* intel_ucode_check_microcode(uc) to check the microcode entry, and
|
||||
* return non-zero should it is faulty, otherwise nasty things can
|
||||
* happen.
|
||||
*
|
||||
* If the callback returns a non-zero value, the foreach operation
|
||||
* is aborted with a INTEL_UCODE_CALLBACK_ERROR error.
|
||||
*/
|
||||
typedef int (intel_ucode_uc_callback)(void * const userdata,
|
||||
const unsigned int uc_count,
|
||||
const void * const uc,
|
||||
const size_t uc_max_size);
|
||||
|
||||
intel_ucode_status_t intel_ucode_foreach_microcode(
|
||||
const void * const uc_bundle,
|
||||
const size_t uc_bundle_size,
|
||||
intel_ucode_uc_callback * const action,
|
||||
void * const userdata);
|
||||
|
||||
/**
|
||||
* intel_ucode_sig_callback() - callback function for the
|
||||
* intel_ucode_foreach_signature() function
|
||||
*
|
||||
* @userdata: pointer as passed to intel_ucode_foreach_signature()
|
||||
* @sig_count: zero-based counter of signatures on this microcode
|
||||
* @cpuid: cpuid this microcode applies to
|
||||
* @pf_mask: processor flags mask this microcode applies to
|
||||
* @uc_data: microcode data
|
||||
* @uc_data_size: microcode data size
|
||||
* @uc: microcode entry (headers and data)
|
||||
* @uc_size: microcode entry size
|
||||
*
|
||||
* DO NOT MODIFY THE MEMORY AREAS REFERENCED BY @uc_data and @uc.
|
||||
*
|
||||
* The callback can obtain data about the microcode through
|
||||
* a call to intel_ucode_getmetadata(uc, metadata).
|
||||
*
|
||||
* If the callback returns a non-zero value, the foreach operation
|
||||
* is aborted with a INTEL_UCODE_CALLBACK_ERROR error.
|
||||
*/
|
||||
typedef int (intel_ucode_sig_callback)(void * const userdata,
|
||||
const unsigned int sig_count,
|
||||
const uint32_t cpuid,
|
||||
const uint32_t pf_mask,
|
||||
const void * const uc_data,
|
||||
const unsigned int uc_data_size,
|
||||
const void * const uc,
|
||||
const unsigned int uc_size);
|
||||
|
||||
intel_ucode_status_t intel_ucode_foreach_signature(const void * const uc,
|
||||
intel_ucode_sig_callback * const action,
|
||||
void * const userdata);
|
||||
|
||||
#endif /* INTEL_MICROCODE_H */
|
|
@ -0,0 +1,489 @@
|
|||
.\" hey, Emacs: -*- nroff -*-
|
||||
.\" Copyright (c) 2010-2018 Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||
.\"
|
||||
.\" iucode_tool 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 2 of the License, or
|
||||
.\" (at your option) any later version.
|
||||
.\"
|
||||
.\" This program 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 this program; see the file COPYING. If not, write to
|
||||
.\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
.\"
|
||||
.TH IUCODE_TOOL 8 "2018-01-28" "IUCODE_TOOL @VERSION@" "iucode_tool manual"
|
||||
.\" Please update the above date whenever this man page is modified.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins (default)
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.\"
|
||||
.\" disable a Debian-specific workaround for the misuse of - to mean \-
|
||||
.char - \(hy
|
||||
.\"
|
||||
.SH NAME
|
||||
iucode_tool \- Tool to manipulate Intel\*R IA-32/X86-64 microcode bundles
|
||||
.SH SYNOPSIS
|
||||
.B iucode_tool
|
||||
.RI [ options ]
|
||||
.RI "[[\-t" type "] " filename | dirname "] ..."
|
||||
.SH DESCRIPTION
|
||||
\fBiucode_tool\fP is an utility that can load Intel\*R processor microcode
|
||||
data from files in both text and binary microcode bundle formats.
|
||||
.PP
|
||||
It can output a list of the microcodes in these files, merge them, upload
|
||||
them to the kernel (to upgrade the microcode in the system processor cores)
|
||||
or write some of them out to a file in binary format for later use.
|
||||
.PP
|
||||
\fBiucode_tool\fP will load all microcodes in the specified files and
|
||||
directories to memory, in order to process them. Duplicated and outdated
|
||||
microcodes will be discarded. It can read microcode data from standard
|
||||
input (\fIstdin\fP), by specifying a file name of \(lq\-\(rq (minus sign).
|
||||
.PP
|
||||
Microcode data files are assumed to be in .dat text format if they have a .dat
|
||||
suffix, and to be in binary format otherwise. Standard input (\fIstdin\fP) is
|
||||
assumed to be in .dat text format. The \fI\-t\fP option can be used to change
|
||||
the type of the files specified after it, including for \fIstdin\fP.
|
||||
.PP
|
||||
If a directory is specified, all files whose names do not begin with a
|
||||
dot will be loaded, in unspecified order. Nested directories are skipped.
|
||||
.PP
|
||||
Empty files and directories are ignored, and will be skipped.
|
||||
.PP
|
||||
You can select which microcodes should be written out, listed or uploaded
|
||||
to the kernel using the
|
||||
.IR "\-S" ", " "\-s" ", " "\-\-date\-before" " and " "\-\-date\-after"
|
||||
options. Should none of those options be specified, all microcodes will be
|
||||
selected.
|
||||
.PP
|
||||
You can upload the selected microcodes to the kernel, write them out to
|
||||
a file (in binary format), to a Linux early initramfs archive, to
|
||||
per-processor-signature files in a directory, or to per-microcode files
|
||||
in a directory using the
|
||||
.IR "\-w" ", "
|
||||
.IR "\-\-write\-earlyfw" ", "
|
||||
.IR "\-k" ", "
|
||||
.IR "\-K" ", and "
|
||||
.IR "\-W" " options."
|
||||
.PP
|
||||
\fBiucode_tool\fP will identify microcodes in its output and error messages
|
||||
using a \(lq\fIn/k\fP\(rq notation, where \(lq\fIn\fP\(rq is the bundle
|
||||
number, and \(lq\fIk\fP\(rq is the microcode number within that bundle. The
|
||||
output of the
|
||||
.IR "\-\-list\-all" " option"
|
||||
when processing multiple input files is the best example of how it works.
|
||||
|
||||
.PP
|
||||
For more information about Intel processor microcodes, please read the
|
||||
included documentation and the Intel manuals listed in the \fISEE ALSO\fP
|
||||
section.
|
||||
|
||||
.SH OPTIONS
|
||||
\fBiucode_tool\fP accepts the following options:
|
||||
|
||||
.TP
|
||||
.BR \-q ", " \-\-quiet
|
||||
Inhibit usual output.
|
||||
.TP
|
||||
.BR \-v ", " \-\-verbose
|
||||
Print more information. Use more than once for added verbosity.
|
||||
.TP
|
||||
.BR \-h ", " \-? ", " \-\-help
|
||||
List all available options and their meanings.
|
||||
.TP
|
||||
.B \-\-usage
|
||||
Show summary of options.
|
||||
.TP
|
||||
.BR \-V ", " \-\-version
|
||||
Show version of program.
|
||||
|
||||
.TP
|
||||
.BI "\-t " type
|
||||
.RI "Sets the file type of the following files. " type " can be:"
|
||||
.RS
|
||||
.IP \fBb\fP
|
||||
binary format. This is the same format used by the kernel driver and the
|
||||
BIOS/EFI, which is described in detail by the
|
||||
.IR "Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A",
|
||||
section 9.11.
|
||||
.IP \fBd\fP
|
||||
Intel microcode .dat text format. This is the format normally used
|
||||
by Intel to distribute microcode data files.
|
||||
.IP \fBr\fP
|
||||
recover microcode in binary format. Search uncompressed generic binary
|
||||
files for microcodes in Intel microcode binary format to recover. Note:
|
||||
It can find microcode that will not pass strict checks, and thus cause
|
||||
\fBiucode_tool\fP to exit if the \fI\-\-no\-strict\-checks\fP or
|
||||
\fI\-\-ignore\-broken\fP options are not in effect.
|
||||
.IP \fBa\fP
|
||||
(default) \fBiucode_tool\fP will use the suffix of the file name to
|
||||
select the file type: .dat text format for files that have a
|
||||
.I .dat
|
||||
suffix, and binary type otherwise. Note that for \fIstdin\fP, .dat
|
||||
text format is assumed.
|
||||
.RE
|
||||
|
||||
.TP
|
||||
.B "\-\-downgrade"
|
||||
When multiple versions of the microcode for a specific processor are
|
||||
available from different files, keep the one from the file loaded last,
|
||||
regardless of revision levels. Files are always loaded in the order
|
||||
they were specified in the command line. This option has no effect
|
||||
when just one file has been loaded.
|
||||
|
||||
.TP
|
||||
.B "\-\-no\-downgrade"
|
||||
When multiple versions of the microcode for a specific processor are
|
||||
available from different files, keep the one with the highest revision
|
||||
level. This is the default mode of operation.
|
||||
|
||||
.TP
|
||||
.B "\-\-strict\-checks"
|
||||
Perform strict checks on the microcode data. It will refuse to load
|
||||
microcodes and microcode data files with unexpected size and metadata. It
|
||||
will also refuse to load microcode entries that have the same metadata, but
|
||||
different payload. This is the default mode of operation.
|
||||
|
||||
.TP
|
||||
.B "\-\-no\-strict\-checks"
|
||||
Perform less strict checks on the microcode data. Use only if you happen
|
||||
to come across a microcode data file that has microcodes with weird sizes
|
||||
or incorrect non-critical metadata (such as invalid dates), which you want
|
||||
to retain. If you just want to skip those, use the \fI\-\-ignore\-broken\fP
|
||||
option.
|
||||
|
||||
.TP
|
||||
.B "\-\-ignore\-broken"
|
||||
Skip broken microcode entries when loading a microcode data file, instead
|
||||
of aborting program execution. If the microcode entry has an unsupported
|
||||
format or had its header severely corrupted, all remaining data in the file
|
||||
will have to be ignored. In that case, using a file type of \fIrecover
|
||||
microcode in binary format\fP (\fI\-tr\fP option) is recommended, as it
|
||||
can skip over badly mangled microcode data.
|
||||
|
||||
.TP
|
||||
.B "\-\-no\-ignore\-broken"
|
||||
Abort program execution if a broken microcode is found while loading a
|
||||
microcode data file. This is the default mode of operation.
|
||||
|
||||
|
||||
.TP
|
||||
.BI "\-s ! | [!]" signature "[,[" pf_mask "][,[" lt: "|" eq: "|" gt: "]" revision "]]"
|
||||
Select microcodes by the specified \fIsignature\fP, \fIprocessor flags mask\fP
|
||||
(\fIpf_mask\fP), and \fIrevision\fP.
|
||||
|
||||
If the \fIprocessor flags mask\fP is specified, it will select only microcodes
|
||||
that are suitable for at least one of the processor flag combinations present
|
||||
in the mask.
|
||||
|
||||
If the \fIrevision\fP is specified, optionally prefixed by one of the
|
||||
\(lq\fIeq:\fP\(rq, \(lq\fIlt:\fP\(rq or \(lq\fIgt:\fP\(rq operators, it will
|
||||
select only microcodes that have that same \fIrevision\fP (if no operator, or
|
||||
if the \(lq\fIeq:\fP\(rq operator is used), or microcodes that have a
|
||||
\fIrevision\fP that is less than (\(lq\fIlt:\fP\(rq operator), or greater than
|
||||
(\(lq\fIgt:\fP\(rq operator), the one specified.
|
||||
|
||||
Specify more than once to select more microcodes. This option can be combined
|
||||
with the \fI\-\-scan\-system\fP option to select more microcodes. If
|
||||
\fIsignature\fP is prefixed with a \(lq\fI!\fP\(rq (exclamation mark), it will
|
||||
deselect microcodes instead. Ordering matters, with later \fI\-s\fP options
|
||||
overriding earlier ones, including \fI\-\-scan\-system\fP.
|
||||
|
||||
When specifying \fIsignature\fP and \fIpf_mask\fP, hexadecimal numbers must be
|
||||
prefixed with \(lq\fI0x\fP\(rq, and octal numbers with \(lq\fI0\fP\(rq.
|
||||
Decimal numbers must not have leading zeros, otherwise they would be
|
||||
interpreted as octal numbers.
|
||||
|
||||
The special notation \fI\-s!\fP (with no \fIsignature\fP parameter) instructs
|
||||
\fBiucode_tool\fP to require explicit inclusion of microcode signatures (using
|
||||
the non\-negated form of \fI\-s\fP, or using \fI\-\-scan\-system\fP).
|
||||
|
||||
.TP
|
||||
.BR "\-S" ", " "\-\-scan\-system" "[=\fImode\fP]"
|
||||
Select microcodes by scanning online processors on this system for their
|
||||
signatures.
|
||||
|
||||
This option can be used only once, and it can be combined with the \fI\-s\fP
|
||||
option to select more microcodes. The microcodes selected by
|
||||
\fI\-\-scan\-system\fP can also be deselected by a later \fI\-s\ !signature\fP
|
||||
option.
|
||||
|
||||
The optional \fImode\fP argument (accepted only by the long version of the
|
||||
option) selects the strategy used to scan processors:
|
||||
.RS
|
||||
.IP "\fB0\fP or \fBauto\fP"
|
||||
Currently the same as \fBfast\fP, but this might change in future versions if
|
||||
Intel ever deploys multi-signature systems that go beyond mixed-stepping. This
|
||||
is the default mode of operation, for backwards compatibility
|
||||
with previous versions of \fBiucode_tool\fP.
|
||||
.IP "\fB1\fP or \fBfast\fP"
|
||||
Uses the cpuid instruction to detect the signature of the processor
|
||||
\fBiucode_tool\fP is running on, and selects all steppings for that processor's
|
||||
type, family and model. Supports mixed-stepping systems.
|
||||
.IP "\fB2\fP or \fBexact\fP"
|
||||
Uses kernel drivers to scan the signature of every online processor directly.
|
||||
This mode supports multi-signature systems. This scan mode will be slow on
|
||||
large systems with many processors, and likely requires special permissions
|
||||
(such as running as the root user). Should the scan fail for any reason, as
|
||||
a fail-safe measure, it will issue an warning and consider all possible
|
||||
steppings for every signature it did manage to scan successfully.
|
||||
.RE
|
||||
|
||||
.TP
|
||||
\fB\-\-date\-before\fR=\fIYYYY\-MM\-DD\fR and \fB\-\-date\-after\fR=\fIYYYY\-MM\-DD\fR
|
||||
Limit the selected microcodes by a date range. The date must be given in ISO
|
||||
format, with four digits for the year and two digits for the month and day and
|
||||
\(lq\fI\-\fP\(rq (minus sign) for the separator. Dates are not range-checked,
|
||||
so you can use \fI\-\-date\-after=2000\-00\-00\fP to select all microcodes
|
||||
dated since January 1st, 2000.
|
||||
|
||||
.TP
|
||||
.B \-\-loose\-date\-filtering
|
||||
When a date range is specified, all revisions of the microcode will be
|
||||
considered for selection (ignoring just the date range, all other filters still
|
||||
apply) should any of the microcode's revisions be within the date range.
|
||||
|
||||
.TP
|
||||
.B \-\-strict\-date\-filtering
|
||||
When a date range is specified, select only microcodes which are within the
|
||||
date range. This is the default mode of operation.
|
||||
|
||||
.TP
|
||||
.BR "\-l" ", " "\-\-list"
|
||||
List selected microcode signatures to standard output (\fIstdout\fP).
|
||||
.TP
|
||||
.BR "\-L" ", " "\-\-list\-all"
|
||||
List all microcode signatures while they're being processed to standard output
|
||||
(\fIstdout\fP).
|
||||
|
||||
.TP
|
||||
.BR "\-k" "[\fIdevice\fP], " "\-\-kernel" "[=\fIdevice\fP]"
|
||||
Upload selected microcodes to the kernel. Optionally, the device path can be
|
||||
specified (default:
|
||||
.IR "@MICROCODE_DEVICE_DEFAULT@" "). This update method is deprecated:
|
||||
it will be removed eventually from the kernel and from iucode_tool.
|
||||
.TP
|
||||
.BR "\-K" "[\fIdirectory\fP], " "\-\-write\-firmware" "[=\fIdirectory\fP]"
|
||||
Write selected microcodes with the file names expected by the Linux kernel
|
||||
firmware loader. Optionally, the destination directory can be specified
|
||||
.RI "(default: " "@MICROCODE_DIR_DEFAULT@" ")."
|
||||
|
||||
.TP
|
||||
.BR "\-w\fIfile\fP" ", " "\-\-write\-to" "=\fIfile\fP"
|
||||
Write selected microcodes to a file in binary format.
|
||||
|
||||
.TP
|
||||
.BR "\-\-write\-earlyfw" "=\fIfile\fP"
|
||||
Write selected microcodes to an early initramfs archive, which should be
|
||||
prepended to the regular initramfs to allow the kernel to update processor
|
||||
microcode very early during system boot.
|
||||
|
||||
.TP
|
||||
.BR "\-W\fIdirectory\fP" ", " "\-\-write\-named\-to" "=\fIdirectory\fP"
|
||||
Write selected microcodes to the specified directory, one microcode per
|
||||
file, in binary format. The file names reflect the microcode signature,
|
||||
processor flags mask and revision.
|
||||
|
||||
.TP
|
||||
.BR "\-\-write\-all\-named\-to" "=\fIdirectory\fP"
|
||||
Write every microcode to the specified directory, one microcode per file,
|
||||
in binary format. The file names reflect the microcode signature,
|
||||
processor flags mask and revision. This is the only way to write out every
|
||||
revision of the same microcode.
|
||||
|
||||
.TP
|
||||
.B "\-\-overwrite"
|
||||
Remove the destination file before writing, if it exists and is not a
|
||||
directory. The destination file is not overwritten in-place. Hardlinks
|
||||
will be severed, and any existing access permissions, ACLs and other
|
||||
extended attributes of the old destination file will be lost.
|
||||
|
||||
.TP
|
||||
.B "\-\-no\-overwrite"
|
||||
Abort if the destination file already exists. This is the default mode of
|
||||
operation. Do note that iucode_tool does not follow non-directory symlinks
|
||||
when writing files.
|
||||
|
||||
.TP
|
||||
.B "\-\-mini\-earlyfw"
|
||||
Optimize the early initramfs cpio container for minimal size. It will
|
||||
change the cpio block size to 16 bytes, and remove header entries for the
|
||||
parent directories of the microcode data file. As a result, the microcode
|
||||
data file will not be available to the regular initramfs, and tools might
|
||||
complain about the non-standard cpio block size.
|
||||
|
||||
This will typically reduce the early initramfs size by 736 bytes.
|
||||
|
||||
.TP
|
||||
.B "\-\-normal\-earlyfw"
|
||||
Optimize the early initramfs size for tool compatibility. This is the
|
||||
default mode of operation. The microcode data file will be available
|
||||
inside the regular initramfs as well.
|
||||
|
||||
.SH NOTES
|
||||
|
||||
\fBiucode_tool\fP reads all data to memory before doing any processing. It
|
||||
enforces a sanity limit of a maximum of 1GiB worth of binary microcode data
|
||||
per microcode data file.
|
||||
|
||||
.PP
|
||||
All informational and error messages are sent to standard error
|
||||
(\fIstderr\fP), while user-requested output (such as output generated by
|
||||
the list options) is sent to standard output (\fIstdout\fP).
|
||||
|
||||
.PP
|
||||
\fBiucode_tool\fP creates files with permissions 0644 (rw\-r\-\-r\-\-),
|
||||
modified by the current umask.
|
||||
|
||||
.PP
|
||||
\fBiucode_tool\fP's selected microcode listing and microcode output files
|
||||
are sorted first by \fIprocessor signature\fP (in ascending order), and
|
||||
then by \fIprocessor flags mask\fP (in descending order).
|
||||
|
||||
.PP
|
||||
When multiple revisions of a microcode are selected, the older ones will
|
||||
be skipped. Only the newest selected revision of a microcode (or the
|
||||
last one in load order when the \fI\-\-downgrade\fP option is active) will
|
||||
be written to a file or uploaded to the kernel.
|
||||
|
||||
.PP
|
||||
Intel microcode data files, both in binary and text formats, can be
|
||||
concatenated to generate a bigger and still valid microcode data file.
|
||||
|
||||
.PP
|
||||
\fBiucode_tool\fP does not follow symlinks when writing microcode data
|
||||
files. It will either refuse to write the file and abort (default mode
|
||||
of operation), or (when the \fI\-\-overwrite\fP option is active) it will
|
||||
remove the target symlink or file (and therefore breaking hardlinks)
|
||||
\fIbefore\fP writing the new file.
|
||||
|
||||
.PP
|
||||
\fBiucode_tool\fP does follow directory symlinks to locate the directory
|
||||
to write files into.
|
||||
|
||||
.SS Linux Notes
|
||||
Before Linux v4.4, the microcode update driver was split in two parts: the
|
||||
early microcode update driver (which gets microcode data from the
|
||||
initramfs) and the late microcode update driver, which could be a module
|
||||
and got microcode data from the firmware subsystem. The two drivers were
|
||||
unified in Linux v4.4.
|
||||
|
||||
The microcode update driver needs to be present in the system at all times
|
||||
to ensure microcode updates are reapplied on resume from suspend and CPU
|
||||
hotplug. Do not unload the microcode module, unless you really know
|
||||
better. Since Linux v4.4, the late microcode driver cannot be a module
|
||||
anymore and will always be present in the system when enabled.
|
||||
|
||||
Updating microcode early is safer. It can only be done at boot and it
|
||||
requires an initramfs, but it is strongly recommended: late microcode
|
||||
updates (which read microcode data from /lib/firmware) cannot safely change
|
||||
visible processor features.
|
||||
|
||||
Early microcode updates are available since Linux v3.9. They can safely
|
||||
change visible processor features (such as the microcode updates that
|
||||
disabled Intel TSX instructions on Intel Haswell cores do). They require
|
||||
an uncompressed initramfs image with the microcode update data in
|
||||
\fI/kernel/x86/microcode/GenuineIntel.bin\fP. This uncompressed initramfs
|
||||
image must come before any compressed initramfs image(s), and it has an
|
||||
special name: \fIearly initramfs\fP.
|
||||
|
||||
The microcode update data inside the early initramfs image must be aligned
|
||||
to a 16-byte boundary due to a bug in several versions of the Linux kernel
|
||||
early microcode update driver. This requires special steps when creating
|
||||
the initramfs archive with the microcode data, and will be handled
|
||||
automatically by the \fBiucode_tool\fP \fI\-\-write\-earlyfw\fP option.
|
||||
|
||||
Since Linux v4.2, it is also possible to build a kernel with the microcode
|
||||
update data as built-in firmware, using the CONFIG_FIRMWARE_IN_KERNEL
|
||||
facility. This feature is not yet mature as of Linux v4.2.8, v4.4.11,
|
||||
v4.5.5 and v4.6, and might not work in every case.
|
||||
|
||||
The \fI/dev/cpu/microcode\fP update interface has been deprecated and
|
||||
should not be used. It has one special requirement: each write syscall
|
||||
must contain whole microcode(s). It can be accessed through
|
||||
\fBiucode_tool\fP \fI\-\-kernel\fP.
|
||||
|
||||
Up to Linux v3.5, late microcode updates were required to be triggered
|
||||
per-core, by writing the number 1 to
|
||||
\fI/sys/devices/system/cpu/*/microcode/reload\fP for every cpu. Depending
|
||||
on kernel version, you must either trigger it on every core to avoid a
|
||||
dangerous situation where some cores are using outdated microcode, or the
|
||||
kernel will accept the request only for the boot processor and use it to
|
||||
trigger an update on all system processor cores.
|
||||
|
||||
Since Linux v3.6, the late microcode update driver has a new interface
|
||||
that explicitly triggers an update for every core at once when the number
|
||||
1 is written to \fI/sys/devices/system/cpu/microcode/reload\fP.
|
||||
|
||||
.SH EXAMPLES
|
||||
.SS Updating files in \fI@MICROCODE_DIR_DEFAULT@\fP:
|
||||
.HP
|
||||
iucode_tool \-K@MICROCODE_DIR_DEFAULT@ \\
|
||||
.br
|
||||
@MICROCODE_DIR_DEFAULT@ \\
|
||||
.br
|
||||
/tmp/file\-with\-new\-microcodes.bin
|
||||
.SS Processing several compressed files at once:
|
||||
.HP
|
||||
zcat intel\-microcode*.dat.gz | iucode_tool\ \-l\ \-
|
||||
.HP
|
||||
zcat intel\-microcode*.bin.gz | iucode_tool \-l\ \-tb\ \-
|
||||
.SS Selecting microcodes and creating an early initramfs:
|
||||
.HP
|
||||
iucode_tool \-\-scan\-system \\
|
||||
.br
|
||||
\-\-write\-earlyfw=/tmp/early.cpio \\
|
||||
.br
|
||||
/lib/firmware/intel\-ucode
|
||||
.HP
|
||||
iucode_tool \-s\ 0x106a5 \-s\ 0x106a4 \-l /lib/firmware/intel\-ucode
|
||||
.SS Using the recovery loader to load and to update microcode in an early initramfs:
|
||||
.HP
|
||||
iucode_tool \-L \-tr /boot/intel\-ucode.img
|
||||
.HP
|
||||
iucode_tool \-Ll \-S \-\-write\-earlyfw=/boot/intel\-ucode.img.new \\
|
||||
.br
|
||||
\-tr /boot/intel\-ucode.img \-tb /lib/firmware/intel\-ucode && \\
|
||||
.br
|
||||
mv /boot/intel\-ucode.img.new /boot/intel\-ucode.img
|
||||
|
||||
.SH BUGS
|
||||
Microcode with negative revision numbers is not special-cased, and will not be
|
||||
preferred over regular microcode.
|
||||
|
||||
.PP
|
||||
The \fIdowngrade mode\fP should be used only for microcodes with the same
|
||||
\fIprocessor flags mask\fP. It cannot handle the corner cases where
|
||||
modifying a \fIprocessor flags mask\fP would be required to force the
|
||||
kernel to load a lower revision of a microcode, and \fBiucode_tool\fP will
|
||||
issue an warning when that happens. So far, this has not proved to be a
|
||||
relevant limitation as changes to the \fIprocessor flags mask\fP of
|
||||
post-launch, production microcode updates are very rare.
|
||||
|
||||
.PP
|
||||
The \fIloader version\fP microcode metadata field is ignored by
|
||||
\fBiucode_tool\fP. This shouldn't cause problems as long as the same signature
|
||||
never needs more than a single type of loader.
|
||||
|
||||
.PP
|
||||
Files are not replaced atomically: if \fBiucode_tool\fP is interrupted while
|
||||
writing to a file, that file will be corrupted.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
\fBThe Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A:
|
||||
System Programming Guide, Part 1\fP (order number 253668), section 9.11.
|
||||
.\" .BR foo (1),
|
||||
.\" .BR bar (1).
|
||||
.SH AUTHOR
|
||||
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,231 @@
|
|||
/* iucode_tool_config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define if building universal (internal helper macro) */
|
||||
#undef AC_APPLE_UNIVERSAL_BUILD
|
||||
|
||||
/* snprintf format string for the per-cpu cpuid device path, relative to
|
||||
CPUID_DEVICE_NAME */
|
||||
#undef CPUID_DEVICE_BASE
|
||||
|
||||
/* path to the per-cpu tree of cpuid devices */
|
||||
#undef CPUID_DEVICE_PARENT
|
||||
|
||||
/* Define to 1 if you have the <cpuid.h> header file. */
|
||||
#undef HAVE_CPUID_H
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the `fgets_unlocked' function. */
|
||||
#undef HAVE_FGETS_UNLOCKED
|
||||
|
||||
/* Define to 1 if you have the `flockfile' function. */
|
||||
#undef HAVE_FLOCKFILE
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#undef HAVE_MALLOC
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||
and to 0 otherwise. */
|
||||
#undef HAVE_REALLOC
|
||||
|
||||
/* Define to 1 if `stat' has the bug that it succeeds when given the
|
||||
zero-length file name argument. */
|
||||
#undef HAVE_STAT_EMPTY_STRING_BUG
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strrchr' function. */
|
||||
#undef HAVE_STRRCHR
|
||||
|
||||
/* Define to 1 if you have the `strtoul' function. */
|
||||
#undef HAVE_STRTOUL
|
||||
|
||||
/* Define to 1 if you have the `strtoull' function. */
|
||||
#undef HAVE_STRTOULL
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the `timegm' function. */
|
||||
#undef HAVE_TIMEGM
|
||||
|
||||
/* Define to 1 if you have the <time.h> header file. */
|
||||
#undef HAVE_TIME_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
|
||||
slash. */
|
||||
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
|
||||
/* Path to kernel microcode device */
|
||||
#undef MICROCODE_DEVICE_DEFAULT
|
||||
|
||||
/* Path to the kernel microcode firmware directory */
|
||||
#undef MICROCODE_DIR_DEFAULT
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Support scanning every core using Linux cpuid device */
|
||||
#undef USE_CPUID_DEVICE
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
|
||||
/* Valgrind-friendly build */
|
||||
#undef VALGRIND_BUILD
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
||||
# if defined __BIG_ENDIAN__
|
||||
# define WORDS_BIGENDIAN 1
|
||||
# endif
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
# undef WORDS_BIGENDIAN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
||||
# define _DARWIN_USE_64_BIT_INODE 1
|
||||
#endif
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
#undef _FILE_OFFSET_BITS
|
||||
|
||||
/* Define for large files, on AIX-style hosts. */
|
||||
#undef _LARGE_FILES
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
#undef _UINT32_T
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
#undef _UINT8_T
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
#undef inline
|
||||
#endif
|
||||
|
||||
/* Define to the type of a signed integer type of width exactly 32 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef int32_t
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
#undef malloc
|
||||
|
||||
/* Define to rpl_realloc if the replacement function should be used. */
|
||||
#undef realloc
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
#undef size_t
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef ssize_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 16 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint16_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 32 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint32_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 8 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint8_t
|
|
@ -0,0 +1,67 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# For every FLAG1, FLAG2 it is checked whether the compiler works with the
|
||||
# flag. If it does, the flag is added FLAGS-VARIABLE
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
|
||||
# CFLAGS) is used. During the check the flag is always added to the
|
||||
# current language's flags.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: This macro depends on the AX_APPEND_FLAG and
|
||||
# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
|
||||
# AX_APPEND_LINK_FLAGS.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 5
|
||||
|
||||
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
|
||||
[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
|
||||
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
|
||||
for flag in $1; do
|
||||
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
|
||||
done
|
||||
])dnl AX_APPEND_COMPILE_FLAGS
|
|
@ -0,0 +1,71 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
|
||||
# added in between.
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
|
||||
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
|
||||
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
|
||||
# FLAG.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 6
|
||||
|
||||
AC_DEFUN([AX_APPEND_FLAG],
|
||||
[dnl
|
||||
AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
|
||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
|
||||
AS_VAR_SET_IF(FLAGS,[
|
||||
AS_CASE([" AS_VAR_GET(FLAGS) "],
|
||||
[*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
|
||||
[
|
||||
AS_VAR_APPEND(FLAGS,[" $1"])
|
||||
AC_RUN_LOG([: FLAGS="$FLAGS"])
|
||||
])
|
||||
],
|
||||
[
|
||||
AS_VAR_SET(FLAGS,[$1])
|
||||
AC_RUN_LOG([: FLAGS="$FLAGS"])
|
||||
])
|
||||
AS_VAR_POPDEF([FLAGS])dnl
|
||||
])dnl AX_APPEND_FLAG
|
|
@ -0,0 +1,65 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# For every FLAG1, FLAG2 it is checked whether the linker works with the
|
||||
# flag. If it does, the flag is added FLAGS-VARIABLE
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is
|
||||
# used. During the check the flag is always added to the linker's flags.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
|
||||
# when the check is done. The check is thus made with the flags: "LDFLAGS
|
||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
||||
# issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG.
|
||||
# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 5
|
||||
|
||||
AC_DEFUN([AX_APPEND_LINK_FLAGS],
|
||||
[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
|
||||
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
|
||||
for flag in $1; do
|
||||
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3], [$4])
|
||||
done
|
||||
])dnl AX_APPEND_LINK_FLAGS
|
|
@ -0,0 +1,74 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's compiler
|
||||
# or gives an error. (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
|
@ -0,0 +1,74 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the linker or gives an error.
|
||||
# (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
|
||||
# when the check is done. The check is thus made with the flags: "LDFLAGS
|
||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
||||
# issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_LINK_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS $4 $1"
|
||||
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
LDFLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_LINK_FLAGS
|
|
@ -0,0 +1,37 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_REQUIRE_DEFINED(MACRO)
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
|
||||
# been defined and thus are available for use. This avoids random issues
|
||||
# where a macro isn't expanded. Instead the configure script emits a
|
||||
# non-fatal:
|
||||
#
|
||||
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
|
||||
#
|
||||
# It's like AC_REQUIRE except it doesn't expand the required macro.
|
||||
#
|
||||
# Here's an example:
|
||||
#
|
||||
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 1
|
||||
|
||||
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
|
||||
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
|
||||
])dnl AX_REQUIRE_DEFINED
|
|
@ -0,0 +1,215 @@
|
|||
#! /bin/sh
|
||||
# Common wrapper for a few potentially missing GNU programs.
|
||||
|
||||
scriptversion=2013-10-28.13; # UTC
|
||||
|
||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# This program 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 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
|
||||
--is-lightweight)
|
||||
# Used by our autoconf macros to check whether the available missing
|
||||
# script is modern enough.
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--run)
|
||||
# Back-compat with the calling convention used by older automake.
|
||||
shift
|
||||
;;
|
||||
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "\
|
||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||
|
||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||
to PROGRAM being missing or too old.
|
||||
|
||||
Options:
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
|
||||
Supported PROGRAM values:
|
||||
aclocal autoconf autoheader autom4te automake makeinfo
|
||||
bison yacc flex lex help2man
|
||||
|
||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||
'g' are ignored when checking the name.
|
||||
|
||||
Send bug reports to <bug-automake@gnu.org>."
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing $scriptversion (GNU Automake)"
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: unknown '$1' option"
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Run the given program, remember its exit status.
|
||||
"$@"; st=$?
|
||||
|
||||
# If it succeeded, we are done.
|
||||
test $st -eq 0 && exit 0
|
||||
|
||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||
# passed; such an option is passed most likely to detect whether the
|
||||
# program is present and works.
|
||||
case $2 in --version|--help) exit $st;; esac
|
||||
|
||||
# Exit code 63 means version mismatch. This often happens when the user
|
||||
# tries to use an ancient version of a tool on a file that requires a
|
||||
# minimum version.
|
||||
if test $st -eq 63; then
|
||||
msg="probably too old"
|
||||
elif test $st -eq 127; then
|
||||
# Program was missing.
|
||||
msg="missing on your system"
|
||||
else
|
||||
# Program was found and executed, but failed. Give up.
|
||||
exit $st
|
||||
fi
|
||||
|
||||
perl_URL=http://www.perl.org/
|
||||
flex_URL=http://flex.sourceforge.net/
|
||||
gnu_software_URL=http://www.gnu.org/software
|
||||
|
||||
program_details ()
|
||||
{
|
||||
case $1 in
|
||||
aclocal|automake)
|
||||
echo "The '$1' program is part of the GNU Automake package:"
|
||||
echo "<$gnu_software_URL/automake>"
|
||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/autoconf>"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
autoconf|autom4te|autoheader)
|
||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||
echo "<$gnu_software_URL/autoconf/>"
|
||||
echo "It also requires GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice ()
|
||||
{
|
||||
# Normalize program name to check for.
|
||||
normalized_program=`echo "$1" | sed '
|
||||
s/^gnu-//; t
|
||||
s/^gnu//; t
|
||||
s/^g//; t'`
|
||||
|
||||
printf '%s\n' "'$1' is $msg."
|
||||
|
||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||
case $normalized_program in
|
||||
autoconf*)
|
||||
echo "You should only need it if you modified 'configure.ac',"
|
||||
echo "or m4 files included by it."
|
||||
program_details 'autoconf'
|
||||
;;
|
||||
autoheader*)
|
||||
echo "You should only need it if you modified 'acconfig.h' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'autoheader'
|
||||
;;
|
||||
automake*)
|
||||
echo "You should only need it if you modified 'Makefile.am' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'automake'
|
||||
;;
|
||||
aclocal*)
|
||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'aclocal'
|
||||
;;
|
||||
autom4te*)
|
||||
echo "You might have modified some maintainer files that require"
|
||||
echo "the 'autom4te' program to be rebuilt."
|
||||
program_details 'autom4te'
|
||||
;;
|
||||
bison*|yacc*)
|
||||
echo "You should only need it if you modified a '.y' file."
|
||||
echo "You may want to install the GNU Bison package:"
|
||||
echo "<$gnu_software_URL/bison/>"
|
||||
;;
|
||||
lex*|flex*)
|
||||
echo "You should only need it if you modified a '.l' file."
|
||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||
echo "<$flex_URL>"
|
||||
;;
|
||||
help2man*)
|
||||
echo "You should only need it if you modified a dependency" \
|
||||
"of a man page."
|
||||
echo "You may want to install the GNU Help2man package:"
|
||||
echo "<$gnu_software_URL/help2man/>"
|
||||
;;
|
||||
makeinfo*)
|
||||
echo "You should only need it if you modified a '.texi' file, or"
|
||||
echo "any other file indirectly affecting the aspect of the manual."
|
||||
echo "You might want to install the Texinfo package:"
|
||||
echo "<$gnu_software_URL/texinfo/>"
|
||||
echo "The spurious makeinfo call might also be the consequence of"
|
||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||
echo "want to install GNU make:"
|
||||
echo "<$gnu_software_URL/make/>"
|
||||
;;
|
||||
*)
|
||||
echo "You might have modified some files without having the proper"
|
||||
echo "tools for further handling them. Check the 'README' file, it"
|
||||
echo "often tells you about the needed prerequisites for installing"
|
||||
echo "this package. You may also peek at any GNU archive site, in"
|
||||
echo "case some other package contains this missing '$1' program."
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||
-e '2,$s/^/ /' >&2
|
||||
|
||||
# Propagate the correct exit status (expected to be 127 for a program
|
||||
# not found, 63 for a program that failed due to version mismatch).
|
||||
exit $st
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
Loading…
Reference in New Issue