Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd97d5cb authored by Isaku Yamahata's avatar Isaku Yamahata Committed by Tony Luck
Browse files

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: default avatarIsaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent ac93925a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@
#define __paravirt_work_processed_syscall_target \
						ia64_work_processed_syscall

#define paravirt_fsyscall_table			ia64_native_fsyscall_table
#define paravirt_fsys_bubble_down		ia64_native_fsys_bubble_down

#ifdef CONFIG_PARAVIRT_GUEST_ASM_CLOBBER_CHECK
# define PARAVIRT_POISON	0xdeadbeefbaadf00d
# define CLOBBER(clob)				\
+15 −0
Original line number Diff line number Diff line
@@ -22,6 +22,21 @@
#ifndef __ASM_PARAVIRT_H
#define __ASM_PARAVIRT_H

#ifndef __ASSEMBLY__
/******************************************************************************
 * fsys related addresses
 */
struct pv_fsys_data {
	unsigned long *fsyscall_table;
	void *fsys_bubble_down;
};

extern struct pv_fsys_data pv_fsys_data;

unsigned long *paravirt_get_fsyscall_table(void);
char *paravirt_get_fsys_bubble_down(void);
#endif

#ifdef CONFIG_PARAVIRT_GUEST

#define PARAVIRT_HYPERVISOR_TYPE_DEFAULT	0
+2 −2
Original line number Diff line number Diff line
@@ -111,9 +111,9 @@ include/asm-ia64/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
clean-files += $(objtree)/include/asm-ia64/nr-irqs.h

#
# native ivt.S and entry.S
# native ivt.S, entry.S and fsys.S
#
ASM_PARAVIRT_OBJS = ivt.o entry.o
ASM_PARAVIRT_OBJS = ivt.o entry.o fsys.o
define paravirtualized_native
AFLAGS_$(1) += -D__IA64_ASM_PARAVIRTUALIZED_NATIVE
AFLAGS_pvchk-sed-$(1) += -D__IA64_ASM_PARAVIRTUALIZED_PVCHECK
+9 −8
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <asm/unistd.h>

#include "entry.h"
#include "paravirt_inst.h"

/*
 * See Documentation/ia64/fsys.txt for details on fsyscalls.
@@ -602,7 +603,7 @@ ENTRY(fsys_fallback_syscall)
	mov r26=ar.pfs
END(fsys_fallback_syscall)
	/* FALL THROUGH */
GLOBAL_ENTRY(fsys_bubble_down)
GLOBAL_ENTRY(paravirt_fsys_bubble_down)
	.prologue
	.altrp b6
	.body
@@ -640,7 +641,7 @@ GLOBAL_ENTRY(fsys_bubble_down)
	 *
	 * PSR.BE : already is turned off in __kernel_syscall_via_epc()
	 * PSR.AC : don't care (kernel normally turns PSR.AC on)
	 * PSR.I  : already turned off by the time fsys_bubble_down gets
	 * PSR.I  : already turned off by the time paravirt_fsys_bubble_down gets
	 *	    invoked
	 * PSR.DFL: always 0 (kernel never turns it on)
	 * PSR.DFH: don't care --- kernel never touches f32-f127 on its own
@@ -650,7 +651,7 @@ GLOBAL_ENTRY(fsys_bubble_down)
	 * PSR.DB : don't care --- kernel never enables kernel-level
	 *	    breakpoints
	 * PSR.TB : must be 0 already; if it wasn't zero on entry to
	 *          __kernel_syscall_via_epc, the branch to fsys_bubble_down
	 *          __kernel_syscall_via_epc, the branch to paravirt_fsys_bubble_down
	 *          will trigger a taken branch; the taken-trap-handler then
	 *          converts the syscall into a break-based system-call.
	 */
@@ -741,14 +742,14 @@ GLOBAL_ENTRY(fsys_bubble_down)
	nop.m 0
(p8)	br.call.sptk.many b6=b6			// B    (ignore return address)
	br.cond.spnt ia64_trace_syscall		// B
END(fsys_bubble_down)
END(paravirt_fsys_bubble_down)

	.rodata
	.align 8
	.globl fsyscall_table
	.globl paravirt_fsyscall_table

	data8 fsys_bubble_down
fsyscall_table:
	data8 paravirt_fsys_bubble_down
paravirt_fsyscall_table:
	data8 fsys_ni_syscall
	data8 0				// exit			// 1025
	data8 0				// read
@@ -1033,4 +1034,4 @@ fsyscall_table:

	// fill in zeros for the remaining entries
	.zero:
	.space fsyscall_table + 8*NR_syscalls - .zero, 0
	.space paravirt_fsyscall_table + 8*NR_syscalls - .zero, 0
+23 −3
Original line number Diff line number Diff line
@@ -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;

Loading