Commit Graph

238 Commits

Author SHA1 Message Date
Josh Poimboeuf
aaf1bf3e8e Merge pull request #288 from spartacus06/section-create-refactor
consolidate new section pair creation
2014-07-01 16:27:06 -05:00
Seth Jennings
1f17adec07 consolidate new section pair creation
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-07-01 16:00:51 -05:00
Seth Jennings
94ec430201 Merge pull request #286 from jpoimboe/check-gcc-version
kpatch-build: gcc version checks
2014-07-01 15:07:55 -05:00
Josh Poimboeuf
73171714bc kpatch-build: gcc version checks
Ensure the version of the locally installed gcc matches the one used to
compile the kernel, and is >= 4.8.

Fixes #246.
2014-07-01 14:24:53 -05:00
Seth Jennings
fd637ce542 Merge pull request #285 from goldyfruit/master
kpatch-build: add debian support
2014-07-01 14:02:57 -05:00
Gaetan Trellu
4e3b4825ad kpatch-build: merge the ubuntu and debian section 2014-07-01 14:41:57 -04:00
Josh Poimboeuf
df679e3192 Merge pull request #278 from spartacus06/user-hook-support-v2
add user-defined load/unload hook support
2014-07-01 13:09:33 -05:00
Seth Jennings
d4e4d14dbe fixup review comments
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-07-01 12:22:16 -05:00
Seth Jennings
1ebae501ba Merge pull request #283 from jpoimboe/mcount
create-diff-object: create __mcount_loc section
2014-07-01 11:10:59 -05:00
Gaetan Trellu
d341e3237e kpatch-build: fix SUBLEVEL in the Makefile 2014-07-01 11:16:23 -04:00
Gaetan Trellu
0459810dd3 kpatch-build: add debian support 2014-07-01 10:55:43 -04:00
Josh Poimboeuf
79bd9f03ee create-diff-object: create __mcount_loc section
For ftrace to be able to trace a patched function, it requires that the
__mcount_loc section contains a pointer to the function, and that the
first instruction of the function is "callq __fentry__".

Normally that work is done by the recordmcount script, but it ignores
functions that aren't in a few standard sections (.text and a few
others).
2014-07-01 08:29:37 -05:00
Josh Poimboeuf
403cf65b89 kpatch-build: don't remove USERSRCDIR
Fixes #279.
2014-06-30 14:20:13 -05:00
Seth Jennings
4835e3edc3 add user-defined load/unload hook support
This commit enables the ability to create user-defined hooks as part of
the normal code patch that can do preparatory work for the application
of the patch.  This work could include, but is not limited to, changing
data structure semantics.

The user may define a new function as part of the patch and mark it as a
load-time or unload-time hook with the kpatch_load_hook() and
kpatch_unload_hook() macros.  These macros are in an include file that
gets copied into the source tree at include/linux/kpatch-hooks.h at
patch build time. The signature for both hooks is "int kpatch_unload_hook(void)".

For now, the return code is ignored.  The hooks may not fail.  They also
run in stop_machine() context and may not sleep.  These hooks, more or
less, must follow all the rules of interrupt context code.
2014-06-30 13:37:26 -05:00
Josh Poimboeuf
895672953e kpatch-build: detect core dump 2014-06-27 12:08:04 -05:00
Seth Jennings
537f68b4fd create-diff-object: fixup new function handling
The original logic in the inclusion tree code worked under the
assumption that it was the only code path marking symbols for inclusion.
Therefore, if the symbol had been marked as included, it could be safely
assumed that we also already called kpatch_include_symbol() on it.  With
the special section handling marking symbols as included, however, this
assumption is not valid.

We should call kpatch_include_symbol() regardless of whether or not the
symbol has already been marked as included or not in order to possible
include the symbol's entire bundle.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-27 09:12:44 -05:00
Seth Jennings
d9472012a2 create-diff-object: reduce verbosity in debug mode
With the inclusion of the debug sections, the debug output is so verbose
that it becomes less useful.

This commit reduces the verbosity by skipping rela listings of debug
sections.

It includes a new helper function, is_debug_section(), to consolidate
the logic for detecting debug sections.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-26 10:46:57 -05:00
Seth Jennings
d13e98f7e5 Merge pull request #267 from jpoimboe/kpatch-symlink
kpatch-build: allow ~/.kpatch to already exist
2014-06-26 09:17:54 -05:00
Josh Poimboeuf
06a2075ab5 kpatch-build: allow ~/.kpatch to already exist
This is useful if ~/.kpatch is a symlink or a tmpfs mount.

- move SRCDIR/OBJDIR/OBJDIR2 initialization to the top
- create new VERSIONFILE variable
- create new clean_cache function which doesn't remove ~/.kpatch

Fixes #261.
2014-06-26 09:05:36 -05:00
Josh Poimboeuf
2362d44783 create-diff-object: include new functions 2014-06-25 16:46:08 -05:00
Josh Poimboeuf
36c98e39d6 fix review comment 2014-06-20 14:34:54 -05:00
Josh Poimboeuf
89ce1c5d79 kpatch-build: --sourcedir 2.0
In my experience this is a much more useful implementation of the
"--sourcedir" option:

- use the source tree in-place rather than first copying it to
  ~/.kpatch/src.  In my case this avoids a 5GB copy, including the
  entire .git subdirectory, and allows ccache to be reused.

- find the vmlinux and .config files in the sourcedir

- autodetect the ARCHVERSION
2014-06-20 08:05:16 -05:00
Josh Poimboeuf
3e4aa955d9 fix review comment 2014-06-19 13:01:54 -05:00
Josh Poimboeuf
eccc3eb63b kpatch-build: DEBUG for create-diff-object
Add -d option to create-diff-object when DEBUG is set.  That way for
weird kpatch-build issues we can just tell people to use the -d flag and
then provide the build log.
2014-06-19 12:30:22 -05:00
Josh Poimboeuf
2e14094844 kpatch-build: fix getopt typo for --target 2014-06-18 16:03:42 -05:00
Seth Jennings
50cb818196 Merge pull request #249 from jpoimboe/undefined-module-symbols
fix undefined symbols for future loaded modules
2014-06-18 13:28:39 -05:00
Josh Poimboeuf
9d016add40 fix review comments 2014-06-18 12:23:38 -05:00
Josh Poimboeuf
34cc258a31 fix undefined symbols for future loaded modules
When patching module A, if one of the new function's relas reference a
symbol in module B, we currently just leave it as a normal rela.  But if
module B hasn't been loaded yet, the patch module will fail to load due
to the rela's reference to an undefined symbol.

The fix is to convert these relas to dynrelas, which can be resolved
later in the module notifier when A is loaded.

Also added support for the R_X86_64_NONE relocation type, needed for
dynrelas which reference __fentry__.
2014-06-18 11:17:11 -05:00
Josh Poimboeuf
7b761b566a create-diff-object: remove SHF_WRITE hack
We're no longer writing directly to the dynrela section, since the core
module has its own kpatch_dynrela data structures now.
2014-06-18 11:13:31 -05:00
Seth Jennings
32b452aabe add debuginfo support
This commit adds basic debuginfo support.  It is "basic" in as much as
it does not try to parse the DWARF data to figure out which parts
pertain to the changed code.  It simply includes all .debug_ and
.rela.debug_ section and strips out any rela entries that reference
unchanged symbols.  This corrupts the debuginfo for unchanged symbols
but since they are not going to be included anyway, there should be no
way to reference that information.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-17 12:25:27 -05:00
Josh Poimboeuf
84c34ff584 implement per-object patching/relocations
The recent module patching code has exposed some problems with our data
structures. We currently patch the funcs and dynrelas individually,
which is kind of scary now that different objects can be patched at
different times.  Instead it's cleaner and safer to group them by
patched object.

This patch implements per-object patching and relocations by refactoring
the interfaces:

- Completely separate the create-diff-object <-> patch module interface
  from the patch module <-> core module interface. create-diff-object
  will include "kpatch-patch.h" but not "kpatch.h". Thus,
  create-diff-object has no knowledge about the core module's
  interfaces, and the core module has no knowledge about the patch
  module's special sections.

- Newly added kpatch-patch.h defines the format of the patch module
  special sections. It's used by create-diff-object to create the
  special sections and used by the patch module to read them.

- kpatch.h still defines the core module interfaces. Each kpatch_module
  has a list of kpatch_objects for each module object to be patched.
  Each kpatch_object has a list of kpatch_funcs and a list of
  kpatch_dynrelas. The patch module creates these lists when populating
  kpatch_module.

This way of structuring the data allows us to patch funcs and dynrelas
on a per patched object basis, which will allow us to catch more error
scenarios and make the code easier to manage going forward.  It also
allows the use of much more common code between kpatch_register() and
kpatch_module_notify().
2014-06-17 10:03:08 -05:00
Seth Jennings
d22ddec366 Merge pull request #242 from jpoimboe/future-loaded-modules
support for patching future loaded modules
2014-06-16 09:04:58 -05:00
Josh Poimboeuf
bba8d1cc2b kmod/core: make dynrelas section writable
On RHEL 7, the core module's write to dynrela->src causes a panic
because the dynrela section is read-only.
2014-06-14 19:12:20 -05:00
Josh Poimboeuf
6770877a9d kpatch-build: skip *.mod.o files
As seen on RHEL7
2014-06-14 10:04:01 -05:00
Josh Poimboeuf
16eb6439b8 kpatch-build: add -t option for custom build targets 2014-06-13 18:00:20 -05:00
Josh Poimboeuf
6c8366d414 kpatch-build: kpatch-build module patching support
This adds support to kpatch-build for patching modules.  It builds the
entire kernel tree, vmlinux and modules, in a single pass and then
detects which modules need to be patched.  This is the easiest case
(since the user doesn't need to care about which binaries are affected)
and the safest (since the user could be wrong).

The first build with no ccache takes a long time, but after the cache is
populated, it only takes about two minutes on my laptop.  It does take
up a TON of space in the cache now though (~/.kpatch/obj is now 8GB).

Next we can add the '-t' cmdline option for advanced users to specify
build targets.
2014-06-13 17:46:51 -05:00
Josh Poimboeuf
5b2bd03a3b kpatch-build: revert previous module building interface
Revert the previous kpatch-build module building interface commits to
prepare for a completely different approach which builds vmlinux and all
the modules in a single pass.

This reverts commit fac9d70612.
This reverts commit d166fb4379.
2014-06-13 17:19:49 -05:00
Josh Poimboeuf
844af68115 kmod/core: support for patching of future loaded modules
This allows a patch module to contain patched functions for modules
which haven't been loaded yet.  If/when the module is loaded later, it
will be patched from the module notifier function.
2014-06-13 12:49:43 -05:00
Seth Jennings
fc722bc438 Merge pull request #241 from jpoimboe/ubuntu-fixes
Ubuntu fixes
2014-06-12 21:53:03 -05:00
Josh Poimboeuf
fc3bba8109 kpatch-build: add ccache symlinks to PATH
On Ubuntu, the ccache symlinks aren't automatically added to the PATH,
so update PATH accordingly.

On Fedora, the PATH is updated automatically when installing ccache.
_But_, it requires a new bash session to be created after installing
ccache before the new PATH takes effect.  So it's a good idea to fix it
for Fedora as well.
2014-06-12 17:13:54 -05:00
Josh Poimboeuf
e0416a3b42 kpatch-build: ubuntu fix for vmlinux_3 error
kpatch load fails on Ubuntu with:

  kpatch: unable to find module 'vmlinux_3'

The root cause is that the vmlinux file on Ubuntu is named
vmlinux-3.13.0-24-generic instead of just vmlinux.

Let's just call it "vmlinux" in the objname field.
2014-06-12 17:13:50 -05:00
Jessica Yu
9de2b5b19d kpatch-build: redirect output of wget, dpkg, and tar to log file, add error message if tar fails 2014-06-12 10:46:58 -07:00
Jessica Yu
a2342b42eb kpatch-build: add error message if dpkg -x fails to extract source 2014-06-11 23:03:25 -07:00
Jessica Yu
c3dd8158f7 kpatch-build: download correct source for the current kernel (for ubuntu)
As per issue #239.
2014-06-11 22:33:03 -07:00
Seth Jennings
fac9d70612 kpatch-build: adjust indentation
The previous commit did not adjust the indentation to ease with
reviewing.  This commit corrects the indentation.  Purely whitespace
change.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-05 15:01:11 -05:00
Seth Jennings
d166fb4379 module patching support for kpatch-build
This commit adds support for module patching with kpatch-build.
It introduces a new option, -t/--targets, that allows the user to
specify kernel make targets that are impacted by the patch.  These
targets will be examined by kpatch-build for changes.

While this approach requires the user to provide more information to
kpatch-build about what exactly has changed, it is better that
rebuilding the entire source tree (make vmlinux && make modules) which
would dramatically increase the runtime and disk space requirements of
using kpatch-build.

Future improvements could include a script that will independently
generate the targets list file.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-05 14:55:37 -05:00
Seth Jennings
d026f9d866 Merge pull request #235 from jpoimboe/verbose-fix
__verbose rela fix
2014-06-04 16:26:50 -05:00
Josh Poimboeuf
aebb618755 create-diff-object: support adding new functions
New functions (sym->status == NEW) shouldn't be added to the
.kpatch.patches section.
2014-06-04 12:09:17 -05:00
Josh Poimboeuf
a16bd618a5 create-diff-object: include relas for non-bundled sections
With test/integration/data-read-mostly.patch, create-diff-object
includes the __verbose section but not the .rela__verbose section, which
is a bug, resulting in the following printk during the integration
tests:

  [13740.801920] dynamic debug error adding module: (null)

If a non-bundled section is included, its rela section should also be
included.  Also add support for converting those relas to dynrelas.
2014-06-04 11:48:23 -05:00
Josh Poimboeuf
3ffe135512 create-diff-object: bundling for .text.unlikely symbols
With -ffunction-sections, some section names are given a prefix of
".text.unlikely." rather than just ".text.".
2014-06-04 10:39:22 -05:00