On Fri, Oct 06, 2017 at 11:27:42AM +0530, Kamalesh Babulal wrote:
>
> Consider the livepatch sequence[1]. Where function A calls B, B is the
> function which has been livepatched and the call to function B is
> redirected to patched version P. P calls the function C in M2, whereas
> C was local to the function B and have became SHN_UNDEF in function P.
> Local call becoming global.
>
> +--------+ +--------+ +--------+ +--------+
> | | +--------+--------+--->| | +-->| |
> | A | | | B | | F | | | P |
> | | | | | | +--+ | |
> | +---+ | | | |<-+ | |
> | |<--+ +----+ C | | | | | |
> | | | | +->| | | | | | |<---+
> | K / M1 | | | | | K / M2 | +-+ Kernel | +---+ Mod3 +--+ |
> +--------+ | | | +--------+ | +--------+ +--------+ | |
> | | | | | |
> +---+-+--------------+ | |
> | | | |
> | +--------------------------------------------+ |
> +------------------------------------------------+
>
>
> Handling such call with regular stub, triggers another error:
>
> module_64: kpatch_meminfo: Expect noop after relocate, got 3d220000
>
> Every branch to SHN_UNDEF is followed by a nop instruction, that gets
> overwritten by an instruction to restore TOC with r2 value that get
> stored onto the stack, before calling the function via global entry
> point.
>
> Given that C was local to function B, it does not store/restore TOC as
> they are not expected to be clobbered for functions called via local
> entry point.
Can you please provide example source code of Mod3 and C? If P calls C, this
is a regular global call, the TOC is saved by the stub and restored after the
call instruction. Why do you think this is not the case?
Torsten