linux-headers/arch/e2k/include/asm/kvm/guest/traps.h

142 lines
3.9 KiB
C

/*
*
* Copyright (C) 2012 MCST
*
* Defenition of kvm guest kernel traps handling routines.
*/
#ifndef _E2K_ASM_KVM_GUEST_TRAPS_H
#define _E2K_ASM_KVM_GUEST_TRAPS_H
#include <linux/kernel.h>
#include <asm/vga.h>
#include <asm/pgtable.h>
extern int kvm_do_hw_stack_bounds(struct pt_regs *regs,
bool proc_bounds, bool chain_bounds);
extern irqreturn_t guest_do_interrupt(struct pt_regs *regs);
extern unsigned long kvm_do_mmio_page_fault(struct pt_regs *regs,
trap_cellar_t *tcellar);
extern void kvm_sysrq_showstate_interrupt(struct pt_regs *regs);
extern void kvm_init_system_handlers_table(void);
static inline void
kvm_instr_page_fault(struct pt_regs *regs, tc_fault_type_t ftype,
const int async_instr)
{
native_instr_page_fault(regs, ftype, async_instr);
}
static inline u64
kvm_TIR0_clear_false_exceptions(u64 TIR_hi, int nr_TIRs)
{
/* all false exceptions were cleared while traps passing to guest */
return TIR_hi;
}
extern int kvm_host_apply_psp_delta_to_signal_stack(unsigned long base,
unsigned long size, unsigned long start,
unsigned long end, unsigned long delta);
extern int kvm_host_apply_pcsp_delta_to_signal_stack(unsigned long base,
unsigned long size, unsigned long start,
unsigned long end, unsigned long delta);
extern int kvm_host_apply_usd_delta_to_signal_stack(unsigned long top,
unsigned long delta, bool incr);
static inline unsigned long
kvm_mmio_page_fault(struct pt_regs *regs, trap_cellar_t *tcellar)
{
e2k_addr_t address;
if (!kernel_mode(regs)) {
/* trap on user and cannot be to IO */
return 0; /* not handled */
}
address = tcellar->address;
if (likely(((address < GUEST_VMALLOC_START ||
address >= GUEST_VMALLOC_END)) &&
!KVM_IS_VGA_VRAM_VIRT_ADDR(address))) {
/* address is out of address space area to IO remap or */
/* VGA VRAM */
return 0; /* not handled */
}
return kvm_do_mmio_page_fault(regs, tcellar);
}
#ifdef CONFIG_KVM_GUEST_KERNEL
/* it is pure guest kernel (paravirtualized pv_ops not used) */
static inline u64
TIR0_clear_false_exceptions(u64 TIR_hi, int nr_TIRs)
{
return kvm_TIR0_clear_false_exceptions(TIR_hi, nr_TIRs);
}
static inline void
instr_page_fault(struct pt_regs *regs, tc_fault_type_t ftype,
const int async_instr)
{
kvm_instr_page_fault(regs, ftype, async_instr);
}
/* The follow function should be deleted */
static inline int
do_hw_stack_bounds(struct pt_regs *regs, bool proc_bounds, bool chain_bounds)
{
return kvm_do_hw_stack_bounds(regs, proc_bounds, chain_bounds);
}
static inline int host_apply_psp_delta_to_signal_stack(unsigned long base,
unsigned long size, unsigned long start,
unsigned long end, unsigned long delta)
{
if (IS_HV_GM()) {
return native_host_apply_psp_delta_to_signal_stack(base, size,
start, end, delta);
}
return kvm_host_apply_psp_delta_to_signal_stack(base, size,
start, end, delta);
}
static inline int host_apply_pcsp_delta_to_signal_stack(unsigned long base,
unsigned long size, unsigned long start,
unsigned long end, unsigned long delta)
{
if (IS_HV_GM()) {
return native_host_apply_pcsp_delta_to_signal_stack(base, size,
start, end, delta);
}
return kvm_host_apply_pcsp_delta_to_signal_stack(base, size,
start, end, delta);
}
static inline int host_apply_usd_delta_to_signal_stack(unsigned long top,
unsigned long delta, bool incr)
{
if (IS_HV_GM()) {
return native_host_apply_usd_delta_to_signal_stack(top, delta,
incr);
}
return kvm_host_apply_usd_delta_to_signal_stack(top, delta, incr);
}
static inline void
handle_interrupt(struct pt_regs *regs)
{
guest_do_interrupt(regs);
}
static inline unsigned long
mmio_page_fault(struct pt_regs *regs, trap_cellar_t *tcellar)
{
return kvm_mmio_page_fault(regs, tcellar);
}
static inline void
init_guest_system_handlers_table(void)
{
kvm_init_system_handlers_table();
}
#endif /* CONFIG_KVM_GUEST_KERNEL */
#endif /* _E2K_ASM_KVM_GUEST_TRAPS_H */