📄 hppa.h
字号:
"i" (sr), \ "r" (grb))/* Purge Instruction Tlb PITLB x(s,b) */#define HPPA_ASM_PITLB(grx,sr,grb) asm volatile ("pitlb %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Purge Data Tlb Entry PDTLBE x(s,b) */#define HPPA_ASM_PDTLBE(grx,sr,grb) asm volatile ("pdtlbe %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Purge Instruction Tlb Entry PITLBE x(s,b) */#define HPPA_ASM_PITLBE(grx,sr,grb) asm volatile ("pitlbe %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Insert Data TLB Address IDTLBA r,(s,b) */#define HPPA_ASM_IDTLBA(gr,sr,grb) asm volatile ("idtlba %0,(%1,%2)" \ : : "r" (gr), \ "i" (sr), \ "r" (grb))/* Insert Instruction TLB Address IITLBA r,(s,b) */#define HPPA_ASM_IITLBA(gr,sr,grb) asm volatile ("iitlba %0,(%1,%2)" \ : : "r" (gr), \ "i" (sr), \ "r" (grb))/* Insert Data TLB Protection IDTLBP r,(s,b) */#define HPPA_ASM_IDTLBP(gr,sr,grb) asm volatile ("idtlbp %0,(%1,%2)" \ : : "r" (gr), \ "i" (sr), \ "r" (grb))/* Insert Instruction TLB Protection IITLBP r,(s,b) */#define HPPA_ASM_IITLBP(gr,sr,grb) asm volatile ("iitlbp %0,(%1,%2)" \ : : "r" (gr), \ "i" (sr), \ "r" (grb))/* Purge Data Cache PDC x(s,b) */#define HPPA_ASM_PDC(grx,sr,grb) asm volatile ("pdc %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Flush Data Cache FDC x(s,b) */#define HPPA_ASM_FDC(grx,sr,grb) asm volatile ("fdc %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Flush Instruction Cache FDC x(s,b) */#define HPPA_ASM_FIC(grx,sr,grb) asm volatile ("fic %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Flush Data Cache Entry FDCE x(s,b) */#define HPPA_ASM_FDCE(grx,sr,grb) asm volatile ("fdce %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Flush Instruction Cache Entry FICE x(s,b) */#define HPPA_ASM_FICE(grx,sr,grb) asm volatile ("fice %0(%1,%2)" \ : : "r" (grx), \ "i" (sr), \ "r" (grb))/* Break BREAK i5,i13 */#define HPPA_ASM_BREAK(i5,i13) asm volatile ("break %0,%1" \ : : "i" (i5), \ "i" (i13))/* Load and Clear Word Short LDCWS d(s,b),t */#define HPPA_ASM_LDCWS(i,sr,grb,grt) asm volatile ("ldcws %1(%2,%3),%0" \ : "=r" (grt) \ : "i" (i), \ "i" (sr), \ "r" (grb))/* Load and Clear Word Indexed LDCWX x(s,b),t */#define HPPA_ASM_LDCWX(grx,sr,grb,grt) asm volatile ("ldcwx %1(%2,%3),%0" \ : "=r" (grt) \ : "r" (grx), \ "i" (sr), \ "r" (grb))/* Load Word Absolute Short LDWAS d(b),t *//* NOTE: "short" here means "short displacement" */#define HPPA_ASM_LDWAS(disp,grbase,gr) asm volatile("ldwas %1(%2),%0" \ : "=r" (gr) \ : "i" (disp), \ "r" (grbase))/* Store Word Absolute Short STWAS r,d(b) *//* NOTE: "short" here means "short displacement" */#define HPPA_ASM_STWAS(gr,disp,grbase) asm volatile("stwas %0,%1(%2)" \ : : "r" (gr), \ "i" (disp), \ "r" (grbase))/* * Swap bytes * REFERENCE: PA72000 TRM -- Appendix C */#define HPPA_ASM_SWAPBYTES(value, swapped) asm volatile( \ " shd %1,%1,16,%0 \n\ dep %0,15,8,%0 \n\ shd %1,%0,8,%0" \ : "=r" (swapped) \ : "r" (value) \ )/* 72000 Diagnose instructions follow * These macros assume gas knows about these instructions. * gas2.2.u1 did not. * I added them to my copy and installed it locally. * * There are *very* special requirements for these guys * ref: TRM 6.1.3 Programming Constraints * * The macros below handle the following rules * * Except for WIT, WDT, WDD, WIDO, WIDE, all DIAGNOSE must be doubled. * Must never be nullified (hence the leading nop) * NOP must preced every RDD,RDT,WDD,WDT,RDTLB * Instruction preceeding GR_SHDW must not set any of the GR's saved * * The macros do *NOT* deal with the following problems * doubled DIAGNOSE instructions must not straddle a page boundary * if code translation enabled. (since 2nd could trap on ITLB) * If you care about DHIT and DPE bits of DR0, then * No store instruction in the 2 insn window before RDD *//* Move To CPU/DIAG register MTCPU r,t */#define HPPA_ASM_MTCPU(gr,dr) asm volatile (" nop \n" \ " mtcpu %1,%0 \n" \ " mtcpu %1,%0" \ : : "i" (dr), \ "r" (gr))/* Move From CPU/DIAG register MFCPU r,t */#define HPPA_ASM_MFCPU(dr,gr) asm volatile (" nop \n" \ " mfcpu %1,%0\n" \ " mfcpu %1,%0" \ : "=r" (gr) \ : "i" (dr))/* Transfer of Control Enable TOC_EN */#define HPPA_ASM_TOC_EN() asm volatile (" tocen \n" \ " tocen")/* Transfer of Control Disable TOC_DIS */#define HPPA_ASM_TOC_DIS() asm volatile (" tocdis \n" \ " tocdis")/* Shadow Registers to General Register SHDW_GR */#define HPPA_ASM_SHDW_GR() asm volatile (" shdwgr \n" \ " shdwgr" \ ::: "r1" "r8" "r9" "r16" \ "r17" "r24" "r25")/* General Registers to Shadow Register GR_SHDW */#define HPPA_ASM_GR_SHDW() asm volatile (" nop \n" \ " grshdw \n" \ " grshdw")/* * Definitions of special registers for use by the above macros. *//* Hardware Space Registers */#define HPPA_SR0 0#define HPPA_SR1 1#define HPPA_SR2 2#define HPPA_SR3 3#define HPPA_SR4 4#define HPPA_SR5 5#define HPPA_SR6 6#define HPPA_SR7 7/* Hardware Control Registers */#define HPPA_CR0 0#define HPPA_RCTR 0 /* Recovery Counter Register */#define HPPA_CR8 8 /* Protection ID 1 */#define HPPA_PIDR1 8#define HPPA_CR9 9 /* Protection ID 2 */#define HPPA_PIDR2 9#define HPPA_CR10 10#define HPPA_CCR 10 /* Coprocessor Confiquration Register */#define HPPA_CR11 11#define HPPA_SAR 11 /* Shift Amount Register */#define HPPA_CR12 12#define HPPA_PIDR3 12 /* Protection ID 3 */#define HPPA_CR13 13#define HPPA_PIDR4 13 /* Protection ID 4 */#define HPPA_CR14 14#define HPPA_IVA 14 /* Interrupt Vector Address */#define HPPA_CR15 15#define HPPA_EIEM 15 /* External Interrupt Enable Mask */#define HPPA_CR16 16#define HPPA_ITMR 16 /* Interval Timer */#define HPPA_CR17 17#define HPPA_PCSQ 17 /* Program Counter Space queue */#define HPPA_CR18 18#define HPPA_PCOQ 18 /* Program Counter Offset queue */#define HPPA_CR19 19#define HPPA_IIR 19 /* Interruption Instruction Register */#define HPPA_CR20 20#define HPPA_ISR 20 /* Interruption Space Register */#define HPPA_CR21 21#define HPPA_IOR 21 /* Interruption Offset Register */#define HPPA_CR22 22#define HPPA_IPSW 22 /* Interrpution Processor Status Word */#define HPPA_CR23 23#define HPPA_EIRR 23 /* External Interrupt Request */#define HPPA_CR24 24#define HPPA_PPDA 24 /* Physcial Page Directory Address */#define HPPA_TR0 24 /* Temporary register 0 */#define HPPA_CR25 25#define HPPA_HTA 25 /* Hash Table Address */#define HPPA_TR1 25 /* Temporary register 1 */#define HPPA_CR26 26#define HPPA_TR2 26 /* Temporary register 2 */#define HPPA_CR27 27#define HPPA_TR3 27 /* Temporary register 3 */#define HPPA_CR28 28#define HPPA_TR4 28 /* Temporary register 4 */#define HPPA_CR29 29#define HPPA_TR5 29 /* Temporary register 5 */#define HPPA_CR30 30#define HPPA_TR6 30 /* Temporary register 6 */#define HPPA_CR31 31#define HPPA_CPUID 31 /* MP identifier *//* * Diagnose registers */#define HPPA_DR0 0#define HPPA_DR1 1#define HPPA_DR8 8#define HPPA_DR24 24#define HPPA_DR25 25/* * Tear apart a break instruction to find its type. */#define HPPA_BREAK5(x) ((x) & 0x1F)#define HPPA_BREAK13(x) (((x) >> 13) & 0x1FFF)/* assemble a break instruction */#define HPPA_BREAK(i5,i13) (((i5) & 0x1F) | (((i13) & 0x1FFF) << 13))/* * this won't work in ASM or non-GNU compilers */#if !defined(ASM) && defined(__GNUC__)/* * static inline utility functions to get at control registers */#define EMIT_GET_CONTROL(name, reg) \static __inline__ unsigned int \get_ ## name (void) \{ \ unsigned int value; \ HPPA_ASM_MFCTL(reg, value); \ return value; \}#define EMIT_SET_CONTROL(name, reg) \static __inline__ void \set_ ## name (unsigned int new_value) \{ \ HPPA_ASM_MTCTL(new_value, reg); \}#define EMIT_CONTROLS(name, reg) \ EMIT_GET_CONTROL(name, reg) \ EMIT_SET_CONTROL(name, reg)EMIT_CONTROLS(recovery, HPPA_RCTR); /* CR0 */EMIT_CONTROLS(pid1, HPPA_PIDR1); /* CR8 */EMIT_CONTROLS(pid2, HPPA_PIDR2); /* CR9 */EMIT_CONTROLS(ccr, HPPA_CCR); /* CR10; CCR and SCR share CR10 */EMIT_CONTROLS(scr, HPPA_CCR); /* CR10; CCR and SCR share CR10 */EMIT_CONTROLS(sar, HPPA_SAR); /* CR11 */EMIT_CONTROLS(pid3, HPPA_PIDR3); /* CR12 */EMIT_CONTROLS(pid4, HPPA_PIDR4); /* CR13 */EMIT_CONTROLS(iva, HPPA_IVA); /* CR14 */EMIT_CONTROLS(eiem, HPPA_EIEM); /* CR15 */EMIT_CONTROLS(itimer, HPPA_ITMR); /* CR16 */EMIT_CONTROLS(pcsq, HPPA_PCSQ); /* CR17 */EMIT_CONTROLS(pcoq, HPPA_PCOQ); /* CR18 */EMIT_CONTROLS(iir, HPPA_IIR); /* CR19 */EMIT_CONTROLS(isr, HPPA_ISR); /* CR20 */EMIT_CONTROLS(ior, HPPA_IOR); /* CR21 */EMIT_CONTROLS(ipsw, HPPA_IPSW); /* CR22 */EMIT_CONTROLS(eirr, HPPA_EIRR); /* CR23 */EMIT_CONTROLS(tr0, HPPA_TR0); /* CR24 */EMIT_CONTROLS(tr1, HPPA_TR1); /* CR25 */EMIT_CONTROLS(tr2, HPPA_TR2); /* CR26 */EMIT_CONTROLS(tr3, HPPA_TR3); /* CR27 */EMIT_CONTROLS(tr4, HPPA_TR4); /* CR28 */EMIT_CONTROLS(tr5, HPPA_TR5); /* CR29 */EMIT_CONTROLS(tr6, HPPA_TR6); /* CR30 */EMIT_CONTROLS(tr7, HPPA_CR31); /* CR31 */#endif /* ASM and GNU *//* * If and How to invoke the debugger (a ROM debugger generally) */#define CPU_INVOKE_DEBUGGER \ do { \ HPPA_ASM_BREAK(1,1); \ } while (0)#ifdef __cplusplus}#endif#endif /* ! _INCLUDE_HPPA_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -