[v5][PATCH 2/3] powerpc/kprobe: complete kprobe and migrate exception frame
tiejun.chen
tiejun.chen at windriver.com
Tue Sep 18 16:13:00 EST 2012
On 09/18/2012 01:09 PM, Benjamin Herrenschmidt wrote:
> On Tue, 2012-09-18 at 15:05 +1000, Benjamin Herrenschmidt wrote:
>> On Mon, 2012-09-17 at 17:54 +0800, Tiejun Chen wrote:
>>> -#ifdef CONFIG_PREEMPT
>>> b restore
>>>
>>> /* N.B. the only way to get here is from the beq following ret_from_except. */
>>> resume_kernel:
>>> - /* check current_thread_info->preempt_count */
>>> + /* check current_thread_info, _TIF_EMULATE_STACK_STORE */
>>> CURRENT_THREAD_INFO(r9, r1)
>>> + lwz r8,TI_FLAGS(r9)
>>> + andis. r8,r8,_TIF_EMULATE_STACK_STORE at h
>>> + beq+ 1f
>>> +
>>> + addi r8,r1,INT_FRAME_SIZE /* Get the kprobed function entry */
>>> +
>>> + lwz r3,GPR1(r1)
>>> + subi r3,r3,INT_FRAME_SIZE /* dst: Allocate a trampoline exception frame */
>>> + mr r4,r1 /* src: current exception frame */
>>> + li r5,INT_FRAME_SIZE /* size: INT_FRAME_SIZE */
>>> + li r6,0 /* start offset: 0 */
>>> + mr r1,r3 /* Reroute the trampoline frame to r1 */
>>> +
>>> + /* Copy from the original to the trampoline. */
>>> + li r6,0
>>
>> You just did that li r6,0 2 lines above :-) I'll fix it up manually
>> while applying.
>
> In fact the srwi can be dropped completely, we can just load r5 with the
> divided value. Committed, will push later today, please test.
I retest to kprobe do_fork() and show_interrupts() with/without enabling
CONFIG_PREEMPT, separately, looks still work.
For 32-bit:
------------
+ /* Copy from the original to the trampoline. */
+ lwz r3,GPR1(r1)
+ subi r3,r3,INT_FRAME_SIZE /* dst: Allocate a trampoline exception
frame */
+ mr r4,r1 /* src: current exception frame */
+ li r5,INT_FRAME_SIZE/4 /* size: INT_FRAME_SIZE */
+ li r6,0 /* start offset: 0 */
+ mr r1,r3 /* Reroute the trampoline frame to r1 */
+ mtctr r5
+2: lwzx r0,r6,r4
+ stwx r0,r6,r3
+ addi r6,r6,4
+ bdnz 2b
And for 64-bit:
---------------
+ /* Copy from the original to the trampoline. */
+ lwz r3,GPR1(r1)
+ subi r3,r3,INT_FRAME_SIZE /* dst: Allocate a trampoline exception
frame */
+ mr r4,r1 /* src: current exception frame */
+ li r5,INT_FRAME_SIZE/8 /* size: INT_FRAME_SIZE */
+ li r6,0 /* start offset: 0 */
+ mr r1,r3 /* Reroute the trampoline frame to r1 */
+ mtctr r5
+2: ldx r0,r6,r4
+ stdx r0,r6,r3
+ addi r6,r6,8
+ bdnz 2b
Thanks
Tiejun
More information about the Linuxppc-dev
mailing list