276 lines
10 KiB
C
276 lines
10 KiB
C
/*
|
|
*
|
|
* Copyright (C) 2001 MCST
|
|
*
|
|
* Defenition of traps handling routines.
|
|
*/
|
|
|
|
#ifndef _E2K_TRAP_DEF_H
|
|
#define _E2K_TRAP_DEF_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define GET_NR_TIRS(tir_hi) ((tir_hi >> 56) & 0xff)
|
|
#define GET_CLEAR_TIR_HI(tir_no) (((tir_no) & 0xffUL) << 56)
|
|
#define GET_CLEAR_TIR_LO(tir_no) 0UL
|
|
|
|
/* get aa field of tir_hi register */
|
|
#define GET_AA_TIRS(tir_hi) ((tir_hi >> 52) & 0x0f)
|
|
#define SET_AA_TIRS(tir_hi, aa_field) ((tir_hi) | (((aa_field) & 0x0f) << 52))
|
|
/* get IP field of tir_lo register */
|
|
#define GET_IP_TIRS(tir_lo) ((tir_lo) & E2K_VA_MASK)
|
|
/* get IP field of cr0_hi register */
|
|
#define GET_IP_CR0_HI(cr0_hi) ((cr0_hi).CR0_hi_ip << E2K_ALIGN_INS)
|
|
|
|
/*
|
|
* Trap Info Register: the numbers of exceptions
|
|
*/
|
|
|
|
#define exc_illegal_opcode_num 0 /* 00 */
|
|
#define exc_priv_action_num 1 /* 01 */
|
|
#define exc_fp_disabled_num 2 /* 02 */
|
|
#define exc_fp_stack_u_num 3 /* 03 */
|
|
#define exc_d_interrupt_num 4 /* 04 */
|
|
#define exc_diag_ct_cond_num 5 /* 05 */
|
|
#define exc_diag_instr_addr_num 6 /* 06 */
|
|
#define exc_illegal_instr_addr_num 7 /* 07 */
|
|
#define exc_instr_debug_num 8 /* 08 */
|
|
#define exc_window_bounds_num 9 /* 09 */
|
|
#define exc_user_stack_bounds_num 10 /* 10 */
|
|
#define exc_proc_stack_bounds_num 11 /* 11 */
|
|
#define exc_chain_stack_bounds_num 12 /* 12 */
|
|
#define exc_fp_stack_o_num 13 /* 13 */
|
|
#define exc_diag_cond_num 14 /* 14 */
|
|
#define exc_diag_operand_num 15 /* 15 */
|
|
#define exc_illegal_operand_num 16 /* 16 */
|
|
#define exc_array_bounds_num 17 /* 17 */
|
|
#define exc_access_rights_num 18 /* 18 */
|
|
#define exc_addr_not_aligned_num 19 /* 19 */
|
|
#define exc_instr_page_miss_num 20 /* 20 */
|
|
#define exc_instr_page_prot_num 21 /* 21 */
|
|
#define exc_ainstr_page_miss_num 22 /* 22 */
|
|
#define exc_ainstr_page_prot_num 23 /* 23 */
|
|
#define exc_last_wish_num 24 /* 24 */
|
|
#define exc_base_not_aligned_num 25 /* 25 */
|
|
#define exc_software_trap_num 26 /* 26 */
|
|
|
|
#define exc_data_debug_num 28 /* 28 */
|
|
#define exc_data_page_num 29 /* 29 */
|
|
|
|
#define exc_recovery_point_num 31 /* 31 */
|
|
#define exc_interrupt_num 32 /* 32 */
|
|
#define exc_nm_interrupt_num 33 /* 33 */
|
|
#define exc_div_num 34 /* 34 */
|
|
#define exc_fp_num 35 /* 35 */
|
|
#define exc_mem_lock_num 36 /* 36 */
|
|
#define exc_mem_lock_as_num 37 /* 37 */
|
|
#define exc_data_error_num 38 /* 38 */
|
|
#define exc_mem_error_out_cpu_num 38 /* 38 */
|
|
#define exc_mem_error_MAU_num 39 /* 39 */
|
|
#define exc_mem_error_L2_num 40 /* 40 */
|
|
#define exc_mem_error_L1_35_num 41 /* 41 */
|
|
#define exc_mem_error_L1_02_num 42 /* 42 */
|
|
#define exc_mem_error_ICACHE_num 43 /* 43 */
|
|
|
|
#define exc_max_num 43
|
|
|
|
#define exc_mova_ch_0_num 52 /* [52] TIR.aa.[0] */
|
|
#define exc_mova_ch_1_num 53 /* [53] TIR.aa.[1] */
|
|
#define exc_mova_ch_2_num 54 /* [54] TIR.aa.[2] */
|
|
#define exc_mova_ch_3_num 55 /* [55] TIR.aa.[3] */
|
|
|
|
#define core_dump_num 38 /* 38 */
|
|
#define masked_hw_stack_bounds_num 60 /* hardware stacks bounds */
|
|
/* trap is occured but masked */
|
|
|
|
/*
|
|
* Trap Info Register: the bit mask of exceptions
|
|
*/
|
|
|
|
#define exc_illegal_opcode_mask (1UL << exc_illegal_opcode_num)
|
|
#define exc_priv_action_mask (1UL << exc_priv_action_num)
|
|
#define exc_fp_disabled_mask (1UL << exc_fp_disabled_num)
|
|
#define exc_fp_stack_u_mask (1UL << exc_fp_stack_u_num)
|
|
#define exc_d_interrupt_mask (1UL << exc_d_interrupt_num)
|
|
#define exc_diag_ct_cond_mask (1UL << exc_diag_ct_cond_num)
|
|
#define exc_diag_instr_addr_mask (1UL << exc_diag_instr_addr_num)
|
|
#define exc_illegal_instr_addr_mask (1UL << exc_illegal_instr_addr_num)
|
|
#define exc_instr_debug_mask (1UL << exc_instr_debug_num)
|
|
#define exc_window_bounds_mask (1UL << exc_window_bounds_num)
|
|
#define exc_user_stack_bounds_mask (1UL << exc_user_stack_bounds_num)
|
|
#define exc_proc_stack_bounds_mask (1UL << exc_proc_stack_bounds_num)
|
|
#define exc_chain_stack_bounds_mask (1UL << exc_chain_stack_bounds_num)
|
|
#define exc_fp_stack_o_mask (1UL << exc_fp_stack_o_num)
|
|
#define exc_diag_cond_mask (1UL << exc_diag_cond_num)
|
|
#define exc_diag_operand_mask (1UL << exc_diag_operand_num)
|
|
#define exc_illegal_operand_mask (1UL << exc_illegal_operand_num)
|
|
#define exc_array_bounds_mask (1UL << exc_array_bounds_num)
|
|
#define exc_access_rights_mask (1UL << exc_access_rights_num)
|
|
#define exc_addr_not_aligned_mask (1UL << exc_addr_not_aligned_num)
|
|
#define exc_instr_page_miss_mask (1UL << exc_instr_page_miss_num)
|
|
#define exc_instr_page_prot_mask (1UL << exc_instr_page_prot_num)
|
|
#define exc_ainstr_page_miss_mask (1UL << exc_ainstr_page_miss_num)
|
|
#define exc_ainstr_page_prot_mask (1UL << exc_ainstr_page_prot_num)
|
|
#define exc_last_wish_mask (1UL << exc_last_wish_num)
|
|
#define exc_base_not_aligned_mask (1UL << exc_base_not_aligned_num)
|
|
#define exc_software_trap_mask (1UL << exc_software_trap_num)
|
|
|
|
#define exc_data_debug_mask (1UL << exc_data_debug_num)
|
|
#define exc_data_page_mask (1UL << exc_data_page_num)
|
|
|
|
#define exc_recovery_point_mask (1UL << exc_recovery_point_num)
|
|
#define exc_interrupt_mask (1UL << exc_interrupt_num)
|
|
#define exc_nm_interrupt_mask (1UL << exc_nm_interrupt_num)
|
|
#define exc_div_mask (1UL << exc_div_num)
|
|
#define exc_fp_mask (1UL << exc_fp_num)
|
|
#define exc_mem_lock_mask (1UL << exc_mem_lock_num)
|
|
#define exc_mem_lock_as_mask (1UL << exc_mem_lock_as_num)
|
|
#define exc_data_error_mask (1UL << exc_data_error_num)
|
|
#define exc_mem_error_out_cpu_mask (1UL << exc_mem_error_out_cpu_num)
|
|
#define exc_mem_error_MAU_mask (1UL << exc_mem_error_MAU_num)
|
|
#define exc_mem_error_L2_mask (1UL << exc_mem_error_L2_num)
|
|
#define exc_mem_error_L1_35_mask (1UL << exc_mem_error_L1_35_num)
|
|
#define exc_mem_error_L1_02_mask (1UL << exc_mem_error_L1_02_num)
|
|
#define exc_mem_error_ICACHE_mask (1UL << exc_mem_error_ICACHE_num)
|
|
#define exc_mem_error_mask (exc_mem_error_out_cpu_mask | \
|
|
exc_mem_error_MAU_mask | \
|
|
exc_mem_error_L2_mask | \
|
|
exc_mem_error_L1_35_mask | \
|
|
exc_mem_error_L1_02_mask | \
|
|
exc_mem_error_ICACHE_mask)
|
|
|
|
#define exc_mova_ch_0_mask (1UL << exc_mova_ch_0_num)
|
|
#define exc_mova_ch_1_mask (1UL << exc_mova_ch_1_num)
|
|
#define exc_mova_ch_2_mask (1UL << exc_mova_ch_2_num)
|
|
#define exc_mova_ch_3_mask (1UL << exc_mova_ch_3_num)
|
|
|
|
#define exc_all_mask ((1UL << (exc_max_num + 1)) - 1UL)
|
|
#define aau_exc_mask (exc_mova_ch_0_mask | \
|
|
exc_mova_ch_1_mask | \
|
|
exc_mova_ch_2_mask | \
|
|
exc_mova_ch_3_mask)
|
|
|
|
#define core_dump_mask (1UL << core_dump_num)
|
|
#define masked_hw_stack_bounds_mask (1UL << masked_hw_stack_bounds_num)
|
|
|
|
#define sync_exc_mask (exc_illegal_opcode_mask | \
|
|
exc_priv_action_mask | \
|
|
exc_fp_disabled_mask | \
|
|
exc_fp_stack_u_mask | \
|
|
exc_diag_ct_cond_mask | \
|
|
exc_diag_instr_addr_mask | \
|
|
exc_illegal_instr_addr_mask | \
|
|
exc_window_bounds_mask | \
|
|
exc_user_stack_bounds_mask | \
|
|
exc_fp_stack_o_mask | \
|
|
exc_diag_cond_mask | \
|
|
exc_diag_operand_mask | \
|
|
exc_illegal_operand_mask | \
|
|
exc_array_bounds_mask | \
|
|
exc_access_rights_mask | \
|
|
exc_addr_not_aligned_mask | \
|
|
exc_instr_page_miss_mask | \
|
|
exc_instr_page_prot_mask | \
|
|
exc_base_not_aligned_mask | \
|
|
exc_software_trap_mask)
|
|
|
|
#define async_exc_mask (exc_proc_stack_bounds_mask | \
|
|
exc_chain_stack_bounds_mask | \
|
|
exc_instr_debug_mask | \
|
|
exc_ainstr_page_miss_mask | \
|
|
exc_ainstr_page_prot_mask | \
|
|
exc_interrupt_mask | \
|
|
exc_nm_interrupt_mask | \
|
|
exc_mem_lock_as_mask | \
|
|
exc_data_error_mask | \
|
|
exc_mem_error_mask)
|
|
|
|
#define defer_exc_mask (exc_data_page_mask | \
|
|
exc_mem_lock_mask | \
|
|
exc_d_interrupt_mask | \
|
|
exc_last_wish_mask)
|
|
|
|
/* Mask of non-maskable interrupts. "exc_data_debug" and "exc_instr_debug"
|
|
* actually can be either maskable or non-maskable depending on the watched
|
|
* event, but we assume the worst case (non-maskable). */
|
|
#define non_maskable_exc_mask (exc_nm_interrupt_mask | \
|
|
exc_data_debug_mask | \
|
|
exc_instr_debug_mask | \
|
|
exc_mem_lock_as_mask)
|
|
|
|
#define have_tc_exc_mask (exc_data_page_mask | \
|
|
exc_mem_lock_mask)
|
|
|
|
#define fp_es (1UL << 7) /* - error summary status; es set if anyone */
|
|
/* of unmasked exception flags is set; */
|
|
|
|
#define fp_pe (1UL << 5) /* - precision exception flag; */
|
|
#define fp_ue (1UL << 4) /* - underflow exception flag; */
|
|
#define fp_oe (1UL << 3) /* - overflow exception flag; */
|
|
#define fp_ze (1UL << 2) /* - divide by zero exception flag; */
|
|
#define fp_de (1UL << 1) /* - denormalized operand exception flag; */
|
|
#define fp_ie (1UL << 0) /* - invalid operation exception flag; */
|
|
|
|
#ifndef __ASSEMBLY__
|
|
/*
|
|
* do_page_fault() return values
|
|
*/
|
|
enum pf_ret {
|
|
/* Could not handle fault, must return to handle signals */
|
|
PFR_SIGPENDING = 1,
|
|
/* The page fault was handled */
|
|
PFR_SUCCESS,
|
|
/* In some cases kernel addresses can be in Trap Cellar if VLIW command
|
|
* consisted of a several load/store operations and one of them caused
|
|
* page fault trap */
|
|
PFR_KERNEL_ADDRESS,
|
|
/* Do not handle speculative access */
|
|
PFR_IGNORE,
|
|
/* Controlled access from kernel to user memory */
|
|
PFR_CONTROLLED_ACCESS,
|
|
/* needs to change SAP to AP for multi_threading of protected mode */
|
|
PFR_AP_THREAD_READ,
|
|
/* trap on paravirtualized guest kernel and is handled by host: */
|
|
/* such result means the trap was handled by hypervisor and it need */
|
|
/* recover faulted operation */
|
|
PFR_KVM_KERNEL_ADDRESS,
|
|
};
|
|
#endif /* ! __ASSEMBLY__ */
|
|
|
|
/*
|
|
* Common system calls (trap table entries numbers)
|
|
*/
|
|
#define LINUX_SYSCALL32_TRAPNUM 1 /* Use E2K trap entry #1 */
|
|
#define LINUX_SYSCALL64_TRAPNUM 3 /* Use E2K trap entry #3 */
|
|
#define LINUX_SYSCALL_TRAPNUM_OLD 4 /* Deprecated */
|
|
#define LINUX_FAST_SYSCALL32_TRAPNUM 5
|
|
#define LINUX_FAST_SYSCALL64_TRAPNUM 6
|
|
#define LINUX_FAST_SYSCALL128_TRAPNUM 7
|
|
|
|
/*
|
|
* Hypercalls
|
|
*/
|
|
#define LINUX_HCALL_GENERIC_TRAPNUM 0 /* guest hardware hypercalls */
|
|
#define LINUX_HCALL_LIGHT_TRAPNUM 1 /* guest light hardware hypercalls */
|
|
|
|
/*
|
|
* Definition of ttable entry number used for protected system calls.
|
|
* This is under agreement with protected mode compiler/plib team.
|
|
*/
|
|
#define PMODE_SYSCALL_TRAPNUM 8
|
|
#define PMODE_NEW_SYSCALL_TRAPNUM 10
|
|
|
|
#define GENERIC_HYPERCALL_TRAPNUM 16 /* guest software hypercalls */
|
|
#define LIGHT_HYPERCALL_TRAPNUM 17 /* guest light software hypercalls */
|
|
|
|
#define HYPERCALLS_TRAPS_MASK ((1U << GENERIC_HYPERCALL_TRAPNUM) | \
|
|
(1U << LIGHT_HYPERCALL_TRAPNUM))
|
|
|
|
/*
|
|
* One trap table entry byte size
|
|
*/
|
|
#define LINUX_SYSCALL_ENTRY_SIZE 0x800 /* one entry max size is */
|
|
/* PAGE_SIZE / 2 */
|
|
|
|
#endif /* _E2K_TRAP_DEF_H */
|