|
@@ -638,13 +638,13 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
|
|
#else
|
|
#else
|
|
" pushf\n"
|
|
" pushf\n"
|
|
/*
|
|
/*
|
|
- * Skip cs, ip, orig_ax.
|
|
|
|
|
|
+ * Skip cs, ip, orig_ax and gs.
|
|
* trampoline_handler() will plug in these values
|
|
* trampoline_handler() will plug in these values
|
|
*/
|
|
*/
|
|
- " subl $12, %esp\n"
|
|
|
|
|
|
+ " subl $16, %esp\n"
|
|
" pushl %fs\n"
|
|
" pushl %fs\n"
|
|
- " pushl %ds\n"
|
|
|
|
" pushl %es\n"
|
|
" pushl %es\n"
|
|
|
|
+ " pushl %ds\n"
|
|
" pushl %eax\n"
|
|
" pushl %eax\n"
|
|
" pushl %ebp\n"
|
|
" pushl %ebp\n"
|
|
" pushl %edi\n"
|
|
" pushl %edi\n"
|
|
@@ -655,10 +655,10 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
|
|
" movl %esp, %eax\n"
|
|
" movl %esp, %eax\n"
|
|
" call trampoline_handler\n"
|
|
" call trampoline_handler\n"
|
|
/* Move flags to cs */
|
|
/* Move flags to cs */
|
|
- " movl 52(%esp), %edx\n"
|
|
|
|
- " movl %edx, 48(%esp)\n"
|
|
|
|
|
|
+ " movl 56(%esp), %edx\n"
|
|
|
|
+ " movl %edx, 52(%esp)\n"
|
|
/* Replace saved flags with true return address. */
|
|
/* Replace saved flags with true return address. */
|
|
- " movl %eax, 52(%esp)\n"
|
|
|
|
|
|
+ " movl %eax, 56(%esp)\n"
|
|
" popl %ebx\n"
|
|
" popl %ebx\n"
|
|
" popl %ecx\n"
|
|
" popl %ecx\n"
|
|
" popl %edx\n"
|
|
" popl %edx\n"
|
|
@@ -666,8 +666,8 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
|
|
" popl %edi\n"
|
|
" popl %edi\n"
|
|
" popl %ebp\n"
|
|
" popl %ebp\n"
|
|
" popl %eax\n"
|
|
" popl %eax\n"
|
|
- /* Skip ip, orig_ax, es, ds, fs */
|
|
|
|
- " addl $20, %esp\n"
|
|
|
|
|
|
+ /* Skip ds, es, fs, gs, orig_ax and ip */
|
|
|
|
+ " addl $24, %esp\n"
|
|
" popf\n"
|
|
" popf\n"
|
|
#endif
|
|
#endif
|
|
" ret\n");
|
|
" ret\n");
|
|
@@ -691,6 +691,7 @@ static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
|
|
regs->cs = __KERNEL_CS;
|
|
regs->cs = __KERNEL_CS;
|
|
#else
|
|
#else
|
|
regs->cs = __KERNEL_CS | get_kernel_rpl();
|
|
regs->cs = __KERNEL_CS | get_kernel_rpl();
|
|
|
|
+ regs->gs = 0;
|
|
#endif
|
|
#endif
|
|
regs->ip = trampoline_address;
|
|
regs->ip = trampoline_address;
|
|
regs->orig_ax = ~0UL;
|
|
regs->orig_ax = ~0UL;
|