ia64/pv_ops: add hooks to paravirtualize fsyscall implementation.
Add two hooks, paravirt_get_fsyscall_table() and paravirt_get_fsys_bubble_doen() to paravirtualize fsyscall implementation. This patch just add the hooks fsyscall and don't paravirtualize it. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
committed by
Tony Luck
parent
ac93925acb
commit
dd97d5cb54
@@ -7,6 +7,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/paravirt.h>
|
||||
#include <asm/patch.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sections.h>
|
||||
@@ -169,16 +170,35 @@ ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)
|
||||
ia64_srlz_i();
|
||||
}
|
||||
|
||||
extern unsigned long ia64_native_fsyscall_table[NR_syscalls];
|
||||
extern char ia64_native_fsys_bubble_down[];
|
||||
struct pv_fsys_data pv_fsys_data __initdata = {
|
||||
.fsyscall_table = (unsigned long *)ia64_native_fsyscall_table,
|
||||
.fsys_bubble_down = (void *)ia64_native_fsys_bubble_down,
|
||||
};
|
||||
|
||||
unsigned long * __init
|
||||
paravirt_get_fsyscall_table(void)
|
||||
{
|
||||
return pv_fsys_data.fsyscall_table;
|
||||
}
|
||||
|
||||
char * __init
|
||||
paravirt_get_fsys_bubble_down(void)
|
||||
{
|
||||
return pv_fsys_data.fsys_bubble_down;
|
||||
}
|
||||
|
||||
static void __init
|
||||
patch_fsyscall_table (unsigned long start, unsigned long end)
|
||||
{
|
||||
extern unsigned long fsyscall_table[NR_syscalls];
|
||||
u64 fsyscall_table = (u64)paravirt_get_fsyscall_table();
|
||||
s32 *offp = (s32 *) start;
|
||||
u64 ip;
|
||||
|
||||
while (offp < (s32 *) end) {
|
||||
ip = (u64) ia64_imva((char *) offp + *offp);
|
||||
ia64_patch_imm64(ip, (u64) fsyscall_table);
|
||||
ia64_patch_imm64(ip, fsyscall_table);
|
||||
ia64_fc((void *) ip);
|
||||
++offp;
|
||||
}
|
||||
@@ -189,7 +209,7 @@ patch_fsyscall_table (unsigned long start, unsigned long end)
|
||||
static void __init
|
||||
patch_brl_fsys_bubble_down (unsigned long start, unsigned long end)
|
||||
{
|
||||
extern char fsys_bubble_down[];
|
||||
u64 fsys_bubble_down = (u64)paravirt_get_fsys_bubble_down();
|
||||
s32 *offp = (s32 *) start;
|
||||
u64 ip;
|
||||
|
||||
|
Reference in New Issue
Block a user