sub do_snap {
my ($out) = @_;
my ($obj) = $out = ~ /^(.*)\.KSPLICE$/ or die;
die if (!-e $obj);
unlink "$obj.KSPLICE_pre" if (-e "$obj.KSPLICE_pre");
empty_diff($out);
}
123456789
sub empty_diff {
my ($out) = @_;
my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
unlink "$obj.KSPLICE_new_code" if (-e "$obj.KSPLICE_new_code");
unlink "$obj.KSPLICE_old_code" if (-e "$obj.KSPLICE_old_code");
open OUT, '>', "$out.tmp";
close OUT;
rename "$out.tmp", $out;
}
sub do_diff {
my ($out) = @_;
my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
my $obj_pre = "$obj.KSPLICE_pre";
die if (!-e $obj);
die "Patch creates new object $obj" if (!-e $obj_pre);
if (system('cmp', '-s', '--', $obj_pre, $obj) == 0) {
unlink $obj_pre;
return empty_diff($out);
}
runval("$libexecdir/ksplice-objmanip", $obj, "$obj.KSPLICE_new_code", "keep-new-code", "$obj.KSPLICE_pre", $ENV{KSPLICE_KID});
return empty_diff($out) if (!-e "$obj.KSPLICE_new_code");
open OUT, '>', "$out.tmp";
print OUT "1\n";
close OUT;
rename "$out.tmp", $out;
runval("$libexecdir/ksplice-objmanip", $obj_pre, "$obj.KSPLICE_old_code", "keep-old-code");
}
sub do_diff {
my ($out) = @_;
my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
my $obj_pre = "$obj.KSPLICE_pre";
die if (!-e $obj);
die "Patch creates new object $obj" if (!-e $obj_pre);
if (system('cmp', '-s', '--', $obj_pre, $obj) == 0) {
unlink $obj_pre;
return empty_diff($out);
}
runval("$libexecdir/ksplice-objmanip", $obj, "$obj.KSPLICE_new_code", "keep-new-code", "$obj.KSPLICE_pre", $ENV{KSPLICE_KID});
return empty_diff($out) if (!-e "$obj.KSPLICE_new_code");
open OUT, '>', "$out.tmp";
print OUT "1\n";
close OUT;
rename "$out.tmp", $out;
runval("$libexecdir/ksplice-objmanip", $obj_pre, "$obj.KSPLICE_old_code", "keep-old-code");
}
WHAT DO I NEED?
---------------
* System.map and .config from your running kernel (a build dir at best)
* sources of your running kernel
* toolkit used to build your running kernel (or as much akin as possible)
* and finally: the patch to be applied
STEP BY STEP HOWTO
------------------
1. create a configuration dir to prepare the build
a) put there System.map
b) put there a build dir named "build" (or a link if you have one already)
c) create flags file there with flags passed to make during the normal
kernel build, like O=path, typically the "build" dir [optional]
2. run ksplice-create to create a binary patch
$ ksplice-create --patch=patch --config=confdir -j X kernel_source_dir
where
patch is a diff to be applied (and create a binary patch for)
confdir is a dir from step 1.
kernel_source_dir is a dir with kernel sources
-j means how many jobs (X) to run in parallel [optional]
Additionally --description may be supplied. It is shown by ksplice-view
later.
3. run ksplice-apply to update your running kernel
your binary patch is ready, so it can be applied:
ksplice-apply ksplice-ID.tar.gz
4. check the applied patches by ksplice-view
5. remove patches by ksplice-undo