ia64_cpu.h
来自「xen虚拟机源代码安装包」· C头文件 代码 · 共 777 行 · 第 1/2 页
H
777 行
/* * Done by Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com> * This code is mostly taken from FreeBSD. * * **************************************************************************** * Copyright (c) 2000 Doug Rabson * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */#ifndef _IA64_CPU_H_#define _IA64_CPU_H_#include "ia64_fpu.h"/* * Definition of Region Register bits (RR) * * RR bit field positions */#define IA64_RR_VE 0#define IA64_RR_MBZ0 1#define IA64_RR_PS 2#define IA64_RR_PS_LEN 6#define IA64_RR_RID 8#define IA64_RR_RID_LEN 24#define IA64_RR_MBZ1 32#define IA64_RR_IDX_POS 61#define IA64_RR_VAL(size,rid) (((size) << IA64_RR_PS) | ((rid) << IA64_RR_RID))/* * Define Protection Key Register (PKR) * * PKR bit field positions */#define IA64_PKR_V 0#define IA64_PKR_WD 1#define IA64_PKR_RD 2#define IA64_PKR_XD 3#define IA64_PKR_MBZ0 4#define IA64_PKR_KEY 8#define IA64_PKR_KEY_LEN 24#define IA64_PKR_MBZ1 32#define IA64_PKR_VALID (1 << IA64_PKR_V)/* * ITIR bit field positions */#define IA64_ITIR_MBZ0 0#define IA64_ITIR_PS 2#define IA64_ITIR_PS_LEN 6#define IA64_ITIR_KEY 8#define IA64_ITIR_KEY_LEN 24#define IA64_ITIR_MBZ1 32#define IA64_ITIR_MBZ1_LEN 16#define IA64_ITIR_PPN 48#define IA64_ITIR_PPN_LEN 15#define IA64_ITIR_MBZ2 63/* * Definition of PSR and IPSR bits. */#define IA64_PSR_BE 0x0000000000000002#define IA64_PSR_UP 0x0000000000000004#define IA64_PSR_AC 0x0000000000000008#define IA64_PSR_MFL 0x0000000000000010#define IA64_PSR_MFH_BIT 5#define IA64_PSR_MFH (1 << IA64_PSR_MFH_BIT)#define IA64_PSR_UMASK (IA64_PSR_BE | IA64_PSR_UP | \ IA64_PSR_AC | IA64_PSR_MFL | \ IA64_PSR_MFH)#define IA64_PSR_IC_BIT 13#define IA64_PSR_IC (1<<IA64_PSR_IC_BIT) /*0x0000000000002000*/#define IA64_PSR_I_BIT 14#define IA64_PSR_I (1<<IA64_PSR_I_BIT) /*0x0000000000004000*/#define IA64_PSR_PK 0x0000000000008000#define IA64_PSR_DT 0x0000000000020000#define IA64_PSR_DFL 0x0000000000040000#define IA64_PSR_DFH 0x0000000000080000#define IA64_PSR_SP 0x0000000000100000#define IA64_PSR_PP 0x0000000000200000#define IA64_PSR_DI 0x0000000000400000#define IA64_PSR_SI 0x0000000000800000#define IA64_PSR_DB 0x0000000001000000#define IA64_PSR_LP 0x0000000002000000#define IA64_PSR_TB 0x0000000004000000#define IA64_PSR_RT 0x0000000008000000#define IA64_PSR_CPL 0x0000000300000000#define IA64_PSR_CPL_KERN 0x0000000000000000#define IA64_PSR_CPL_1 0x0000000100000000#define IA64_PSR_CPL_2 0x0000000200000000#define IA64_PSR_CPL_USER 0x0000000300000000#define IA64_PSR_IS 0x0000000400000000#define IA64_PSR_MC 0x0000000800000000#define IA64_PSR_IT 0x0000001000000000#define IA64_PSR_ID 0x0000002000000000#define IA64_PSR_DA 0x0000004000000000#define IA64_PSR_DD 0x0000008000000000#define IA64_PSR_SS 0x0000010000000000#define IA64_PSR_RI 0x0000060000000000#define IA64_PSR_RI_0 0x0000000000000000#define IA64_PSR_RI_1 0x0000020000000000#define IA64_PSR_RI_2 0x0000040000000000#define IA64_PSR_RI_SHIFT 41#define IA64_PSR_ED 0x0000080000000000#define IA64_PSR_BN 0x0000100000000000#define IA64_PSR_IA 0x0000200000000000/* Endianess of mini-os. */#if defined(BIG_ENDIAN)#define MOS_IA64_PSR_BE IA64_PSR_BE#else#define MOS_IA64_PSR_BE 0#endif#define STARTUP_PSR (IA64_PSR_IT | IA64_PSR_PK | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ IA64_PSR_BN | IA64_PSR_CPL_KERN | IA64_PSR_AC)#define MOS_SYS_PSR (IA64_PSR_IC | IA64_PSR_I | IA64_PSR_IT | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ IA64_PSR_BN | IA64_PSR_CPL_KERN | IA64_PSR_AC)#define MOS_USR_PSR (IA64_PSR_IC | IA64_PSR_I | IA64_PSR_IT | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ IA64_PSR_BN | IA64_PSR_CPL_USER | IA64_PSR_AC)/* * Definition of ISR bits. */#define IA64_ISR_CODE 0x000000000000ffff#define IA64_ISR_VECTOR 0x0000000000ff0000#define IA64_ISR_X 0x0000000100000000#define IA64_ISR_W 0x0000000200000000#define IA64_ISR_R 0x0000000400000000#define IA64_ISR_NA 0x0000000800000000#define IA64_ISR_SP 0x0000001000000000#define IA64_ISR_RS 0x0000002000000000#define IA64_ISR_IR 0x0000004000000000#define IA64_ISR_NI 0x0000008000000000#define IA64_ISR_SO 0x0000010000000000#define IA64_ISR_EI 0x0000060000000000#define IA64_ISR_EI_0 0x0000000000000000#define IA64_ISR_EI_1 0x0000020000000000#define IA64_ISR_EI_2 0x0000040000000000#define IA64_ISR_ED 0x0000080000000000/* * DCR bit positions */#define IA64_DCR_PP 0#define IA64_DCR_BE 1#define IA64_DCR_LC 2#define IA64_DCR_MBZ0 4#define IA64_DCR_MBZ0_V 0xf#define IA64_DCR_DM 8#define IA64_DCR_DP 9#define IA64_DCR_DK 10#define IA64_DCR_DX 11#define IA64_DCR_DR 12#define IA64_DCR_DA 13#define IA64_DCR_DD 14#define IA64_DCR_DEFER_ALL 0x7f00#define IA64_DCR_MBZ1 2#define IA64_DCR_MBZ1_V 0xffffffffffffULL /* Endianess of DCR register. */#if defined(BIG_ENDIAN)#define MOS_IA64_DCR_BE (1 << IA64_DCR_BE)#else#define MOS_IA64_DCR_BE (0 << IA64_DCR_BE)#endif#define IA64_DCR_DEFAULT (MOS_IA64_DCR_BE)/* * Vector numbers for various ia64 interrupts. */#define IA64_VEC_VHPT 0#define IA64_VEC_ITLB 1#define IA64_VEC_DTLB 2#define IA64_VEC_ALT_ITLB 3#define IA64_VEC_ALT_DTLB 4#define IA64_VEC_NESTED_DTLB 5#define IA64_VEC_IKEY_MISS 6#define IA64_VEC_DKEY_MISS 7#define IA64_VEC_DIRTY_BIT 8#define IA64_VEC_INST_ACCESS 9#define IA64_VEC_DATA_ACCESS 10#define IA64_VEC_BREAK 11#define IA64_VEC_EXT_INTR 12#define IA64_VEC_PAGE_NOT_PRESENT 20#define IA64_VEC_KEY_PERMISSION 21#define IA64_VEC_INST_ACCESS_RIGHTS 22#define IA64_VEC_DATA_ACCESS_RIGHTS 23#define IA64_VEC_GENERAL_EXCEPTION 24#define IA64_VEC_DISABLED_FP 25#define IA64_VEC_NAT_CONSUMPTION 26#define IA64_VEC_SPECULATION 27#define IA64_VEC_DEBUG 29#define IA64_VEC_UNALIGNED_REFERENCE 30#define IA64_VEC_UNSUPP_DATA_REFERENCE 31#define IA64_VEC_FLOATING_POINT_FAULT 32#define IA64_VEC_FLOATING_POINT_TRAP 33#define IA64_VEC_LOWER_PRIVILEGE_TRANSFER 34#define IA64_VEC_TAKEN_BRANCH_TRAP 35#define IA64_VEC_SINGLE_STEP_TRAP 36#define IA64_VEC_IA32_EXCEPTION 45#define IA64_VEC_IA32_INTERCEPT 46#define IA64_VEC_IA32_INTERRUPT 47/* * Define hardware RSE Configuration Register * * RS Configuration (RSC) bit field positions */#define IA64_RSC_MODE 0#define IA64_RSC_PL 2#define IA64_RSC_BE 4#define IA64_RSC_MBZ0 5#define IA64_RSC_MBZ0_V 0x3ff#define IA64_RSC_LOADRS 16#define IA64_RSC_LOADRS_LEN 14#define IA64_RSC_MBZ1 30#define IA64_RSC_MBZ1_V 0x3ffffffffULL/* * RSC modes */#define IA64_RSC_MODE_LY (0x0) /* Lazy */#define IA64_RSC_MODE_SI (0x1) /* Store intensive */#define IA64_RSC_MODE_LI (0x2) /* Load intensive */#define IA64_RSC_MODE_EA (0x3) /* Eager *//* RSE endian mode. */#if defined(BIG_ENDIAN)#define MOS_IA64_RSC_BE 1 /* Big endian rse. */#else#define MOS_IA64_RSC_BE 0 /* Little endian rse. */#endif#define IA64_RSE_EAGER ((IA64_RSC_MODE_EA<<IA64_RSC_MODE) | \ (MOS_IA64_RSC_BE << IA64_RSC_BE) )#define IA64_RSE_LAZY ((IA64_RSC_MODE_LY<<IA64_RSC_MODE) | \ (MOS_IA64_RSC_BE << IA64_RSC_BE) )#ifndef __ASSEMBLY__/* ia64 function descriptor and global pointer */struct ia64_fdesc{ uint64_t func; uint64_t gp;};typedef struct ia64_fdesc ia64_fdesc_t;#define FDESC_FUNC(fn) (((struct ia64_fdesc *) fn)->func)#define FDESC_GP(fn) (((struct ia64_fdesc *) fn)->gp)/* * Various special ia64 instructions. *//* * Memory Fence. */static __inline voidia64_mf(void){ __asm __volatile("mf" ::: "memory");}static __inline voidia64_mf_a(void){ __asm __volatile("mf.a");}/* * Flush Cache. */static __inline voidia64_fc(uint64_t va){ __asm __volatile("fc %0" :: "r"(va));}/* * Sync instruction stream. */static __inline voidia64_sync_i(void){ __asm __volatile("sync.i");}/* * Calculate address in VHPT for va. */static __inline uint64_tia64_thash(uint64_t va){ uint64_t result; __asm __volatile("thash %0=%1" : "=r" (result) : "r" (va)); return result;}/* * Calculate VHPT tag for va. */static __inline uint64_tia64_ttag(uint64_t va){ uint64_t result; __asm __volatile("ttag %0=%1" : "=r" (result) : "r" (va)); return result;}/* * Convert virtual address to physical. */static __inline uint64_tia64_tpa(uint64_t va){ uint64_t result; __asm __volatile("tpa %0=%1" : "=r" (result) : "r" (va)); return result;}/* * Generate a ptc.e instruction. */static __inline voidia64_ptc_e(uint64_t v){ __asm __volatile("ptc.e %0;; srlz.d;;" :: "r"(v));}/* * Generate a ptc.g instruction. */static __inline voidia64_ptc_g(uint64_t va, uint64_t size){ __asm __volatile("ptc.g %0,%1;; srlz.d;;" :: "r"(va), "r"(size<<2));}/* * Generate a ptc.ga instruction. */static __inline voidia64_ptc_ga(uint64_t va, uint64_t size){ __asm __volatile("ptc.ga %0,%1;; srlz.d;;" :: "r"(va), "r"(size<<2));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?