Commit 65566abd authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

pie/vdso: add i386 trampoline

Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 789f9208
...@@ -20,16 +20,34 @@ typedef struct { ...@@ -20,16 +20,34 @@ typedef struct {
u16 jmp_rax; u16 jmp_rax;
u32 guards; u32 guards;
} __packed jmp_t; } __packed jmp_t;
#define IMMEDIATE(j) (j.imm64)
jmp_t jmp = {
.movabs = 0xb848,
.jmp_rax = 0xe0ff,
.guards = 0xcccccccc,
};
#else /* CONFIG_X86_64 */
typedef struct {
u8 movl;
u32 imm32;
u16 jmp_eax;
u32 guards;
} __packed jmp_t;
#define IMMEDIATE(j) (j.imm32)
jmp_t jmp = {
.movl = 0xb8,
.jmp_eax = 0xe0ff,
.guards = 0xcccccccc,
};
#endif /* CONFIG_X86_64 */
int vdso_redirect_calls(unsigned long base_to, unsigned long base_from, int vdso_redirect_calls(unsigned long base_to, unsigned long base_from,
struct vdso_symtable *to, struct vdso_symtable *to,
struct vdso_symtable *from) struct vdso_symtable *from)
{ {
jmp_t jmp = {
.movabs = 0xb848,
.jmp_rax = 0xe0ff,
.guards = 0xcccccccc,
};
unsigned int i; unsigned int i;
for (i = 0; i < ARRAY_SIZE(to->symbols); i++) { for (i = 0; i < ARRAY_SIZE(to->symbols); i++) {
...@@ -40,20 +58,9 @@ int vdso_redirect_calls(unsigned long base_to, unsigned long base_from, ...@@ -40,20 +58,9 @@ int vdso_redirect_calls(unsigned long base_to, unsigned long base_from,
base_from, from->symbols[i].offset, base_from, from->symbols[i].offset,
base_to, to->symbols[i].offset, i); base_to, to->symbols[i].offset, i);
jmp.imm64 = base_to + to->symbols[i].offset; IMMEDIATE(jmp) = base_to + to->symbols[i].offset;
memcpy((void *)(base_from + from->symbols[i].offset), &jmp, sizeof(jmp)); memcpy((void *)(base_from + from->symbols[i].offset), &jmp, sizeof(jmp));
} }
return 0; return 0;
} }
#else /* CONFIG_X86_64 */
int vdso_redirect_calls(unsigned long base_to, unsigned long base_from,
struct vdso_symtable *to,
struct vdso_symtable *from)
{
return 0;
}
#endif /* CONFIG_X86_64 */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment