/* * Copyright (C) 1999 Hewlett-Packard (Frank Rowand) * Copyright (C) 1999 Philipp Rumpf * Copyright (C) 1999 SuSE GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _PARISC_ASSEMBLY_H #define _PARISC_ASSEMBLY_H #if defined(__LP64__) && defined(__ASSEMBLY__) /* the 64-bit pa gnu assembler unfortunately defaults to .level 1.1 or 2.0 so * work around that for now... */ .level 2.0w #endif #include #include #include sp = 30 gp = 27 ipsw = 22 #if __PAGE_OFFSET == 0xc0000000 .macro tophys gr zdep \gr, 31, 30, \gr .endm .macro tovirt gr depi 3,1,2,\gr .endm #else #error unknown __PAGE_OFFSET #endif .macro delay value ldil L%\value, 1 ldo R%\value(1), 1 addib,UV,n -1,1,. addib,NUV,n -1,1,.+8 nop .endm .macro debug value .endm #ifdef __LP64__ # define LDIL_FIXUP(reg) depdi 0,31,32,reg #else # define LDIL_FIXUP(reg) #endif /* load 32-bit 'value' into 'reg' compensating for the ldil * sign-extension when running in wide mode. * WARNING!! neither 'value' nor 'reg' can be expressions * containing '.'!!!! */ .macro load32 value, reg ldil L%\value, \reg ldo R%\value(\reg), \reg LDIL_FIXUP(\reg) .endm #ifdef __LP64__ #define LDREG ldd #define STREG std #define RP_OFFSET 16 #else #define LDREG ldw #define STREG stw #define RP_OFFSET 20 #endif .macro loadgp #ifdef __LP64__ ldil L%__gp, %r27 ldo R%__gp(%r27), %r27 LDIL_FIXUP(%r27) #else ldil L%$global$, %r27 ldo R%$global$(%r27), %r27 #endif .endm #define SAVE_SP(r, where) mfsp r, %r1 ! STREG %r1, where #define REST_SP(r, where) LDREG where, %r1 ! mtsp %r1, r #define SAVE_CR(r, where) mfctl r, %r1 ! STREG %r1, where #define REST_CR(r, where) LDREG where, %r1 ! mtctl %r1, r .macro save_general regs STREG %r2, PT_GR2 (\regs) STREG %r3, PT_GR3 (\regs) STREG %r4, PT_GR4 (\regs) STREG %r5, PT_GR5 (\regs) STREG %r6, PT_GR6 (\regs) STREG %r7, PT_GR7 (\regs) STREG %r8, PT_GR8 (\regs) STREG %r9, PT_GR9 (\regs) STREG %r10, PT_GR10(\regs) STREG %r11, PT_GR11(\regs) STREG %r12, PT_GR12(\regs) STREG %r13, PT_GR13(\regs) STREG %r14, PT_GR14(\regs) STREG %r15, PT_GR15(\regs) STREG %r16, PT_GR16(\regs) STREG %r17, PT_GR17(\regs) STREG %r18, PT_GR18(\regs) STREG %r19, PT_GR19(\regs) STREG %r20, PT_GR20(\regs) STREG %r21, PT_GR21(\regs) STREG %r22, PT_GR22(\regs) STREG %r23, PT_GR23(\regs) STREG %r24, PT_GR24(\regs) STREG %r25, PT_GR25(\regs) /* r26 is clobbered by cr19 and assumed to be saved before hand */ STREG %r27, PT_GR27(\regs) STREG %r28, PT_GR28(\regs) /* r29 is already saved and points to PT_xxx struct */ /* r30 stack pointer saved in get_stack */ STREG %r31, PT_GR31(\regs) .endm .macro rest_general regs LDREG PT_GR2 (\regs), %r2 LDREG PT_GR3 (\regs), %r3 LDREG PT_GR4 (\regs), %r4 LDREG PT_GR5 (\regs), %r5 LDREG PT_GR6 (\regs), %r6 LDREG PT_GR7 (\regs), %r7 LDREG PT_GR8 (\regs), %r8 LDREG PT_GR9 (\regs), %r9 LDREG PT_GR10(\regs), %r10 LDREG PT_GR11(\regs), %r11 LDREG PT_GR12(\regs), %r12 LDREG PT_GR13(\regs), %r13 LDREG PT_GR14(\regs), %r14 LDREG PT_GR15(\regs), %r15 LDREG PT_GR16(\regs), %r16 LDREG PT_GR17(\regs), %r17 LDREG PT_GR18(\regs), %r18 LDREG PT_GR19(\regs), %r19 LDREG PT_GR20(\regs), %r20 LDREG PT_GR21(\regs), %r21 LDREG PT_GR22(\regs), %r22 LDREG PT_GR23(\regs), %r23 LDREG PT_GR24(\regs), %r24 LDREG PT_GR25(\regs), %r25 LDREG PT_GR26(\regs), %r26 LDREG PT_GR27(\regs), %r27 LDREG PT_GR28(\regs), %r28 /* r30 stack pointer restored in rest_stack */ LDREG PT_GR31(\regs), %r31 .endm .macro save_fp regs fstd,ma %fr0, 8(\regs) fstd,ma %fr1, 8(\regs) fstd,ma %fr2, 8(\regs) fstd,ma %fr3, 8(\regs) fstd,ma %fr4, 8(\regs) fstd,ma %fr5, 8(\regs) fstd,ma %fr6, 8(\regs) fstd,ma %fr7, 8(\regs) fstd,ma %fr8, 8(\regs) fstd,ma %fr9, 8(\regs) fstd,ma %fr10, 8(\regs) fstd,ma %fr11, 8(\regs) fstd,ma %fr12, 8(\regs) fstd,ma %fr13, 8(\regs) fstd,ma %fr14, 8(\regs) fstd,ma %fr15, 8(\regs) fstd,ma %fr16, 8(\regs) fstd,ma %fr17, 8(\regs) fstd,ma %fr18, 8(\regs) fstd,ma %fr19, 8(\regs) fstd,ma %fr20, 8(\regs) fstd,ma %fr21, 8(\regs) fstd,ma %fr22, 8(\regs) fstd,ma %fr23, 8(\regs) fstd,ma %fr24, 8(\regs) fstd,ma %fr25, 8(\regs) fstd,ma %fr26, 8(\regs) fstd,ma %fr27, 8(\regs) fstd,ma %fr28, 8(\regs) fstd,ma %fr29, 8(\regs) fstd,ma %fr30, 8(\regs) fstd %fr31, 0(\regs) .endm .macro rest_fp regs fldd 0(\regs), %fr31 fldd,mb -8(\regs), %fr30 fldd,mb -8(\regs), %fr29 fldd,mb -8(\regs), %fr28 fldd,mb -8(\regs), %fr27 fldd,mb -8(\regs), %fr26 fldd,mb -8(\regs), %fr25 fldd,mb -8(\regs), %fr24 fldd,mb -8(\regs), %fr23 fldd,mb -8(\regs), %fr22 fldd,mb -8(\regs), %fr21 fldd,mb -8(\regs), %fr20 fldd,mb -8(\regs), %fr19 fldd,mb -8(\regs), %fr18 fldd,mb -8(\regs), %fr17 fldd,mb -8(\regs), %fr16 fldd,mb -8(\regs), %fr15 fldd,mb -8(\regs), %fr14 fldd,mb -8(\regs), %fr13 fldd,mb -8(\regs), %fr12 fldd,mb -8(\regs), %fr11 fldd,mb -8(\regs), %fr10 fldd,mb -8(\regs), %fr9 fldd,mb -8(\regs), %fr8 fldd,mb -8(\regs), %fr7 fldd,mb -8(\regs), %fr6 fldd,mb -8(\regs), %fr5 fldd,mb -8(\regs), %fr4 fldd,mb -8(\regs), %fr3 fldd,mb -8(\regs), %fr2 fldd,mb -8(\regs), %fr1 fldd,mb -8(\regs), %fr0 .endm #ifdef __LP64__ .macro callee_save ldo 144(%r30), %r30 std %r3, -144(%r30) std %r4, -136(%r30) std %r5, -128(%r30) std %r6, -120(%r30) std %r7, -112(%r30) std %r8, -104(%r30) std %r9, -96(%r30) std %r10, -88(%r30) std %r11, -80(%r30) std %r12, -72(%r30) std %r13, -64(%r30) std %r14, -56(%r30) std %r15, -48(%r30) std %r16, -40(%r30) std %r17, -32(%r30) std %r18, -24(%r30) .endm .macro callee_rest ldd -24(%r30), %r18 ldd -32(%r30), %r17 ldd -40(%r30), %r16 ldd -48(%r30), %r15 ldd -56(%r30), %r14 ldd -64(%r30), %r13 ldd -72(%r30), %r12 ldd -80(%r30), %r11 ldd -88(%r30), %r10 ldd -96(%r30), %r9 ldd -104(%r30), %r8 ldd -112(%r30), %r7 ldd -120(%r30), %r6 ldd -128(%r30), %r5 ldd -136(%r30), %r4 ldd -144(%r30), %r3 ldo -144(%r30), %r30 .endm #else /* __LP64__ */ .macro callee_save ldo 128(30), 30 stw 3, -128(30) stw 4, -124(30) stw 5, -120(30) stw 6, -116(30) stw 7, -112(30) stw 8, -108(30) stw 9, -104(30) stw 10, -100(30) stw 11, -96(30) stw 12, -92(30) stw 13, -88(30) stw 14, -84(30) stw 15, -80(30) stw 16, -76(30) stw 17, -72(30) stw 18, -68(30) .endm .macro callee_rest ldw -68(30), 18 ldw -72(30), 17 ldw -76(30), 16 ldw -80(30), 15 ldw -84(30), 14 ldw -88(30), 13 ldw -92(30), 12 ldw -96(30), 11 ldw -100(30), 10 ldw -104(30), 9 ldw -108(30), 8 ldw -112(30), 7 ldw -116(30), 6 ldw -120(30), 5 ldw -124(30), 4 ldw -128(30), 3 ldo -128(30), 30 .endm #endif /* __LP64__ */ .macro save_specials regs SAVE_SP (%sr0, PT_SR0 (\regs)) SAVE_SP (%sr1, PT_SR1 (\regs)) SAVE_SP (%sr2, PT_SR2 (\regs)) SAVE_SP (%sr3, PT_SR3 (\regs)) SAVE_SP (%sr4, PT_SR4 (\regs)) SAVE_SP (%sr5, PT_SR5 (\regs)) SAVE_SP (%sr6, PT_SR6 (\regs)) SAVE_SP (%sr7, PT_SR7 (\regs)) SAVE_CR (%cr17, PT_IASQ0(\regs)) mtctl %r0, %cr17 SAVE_CR (%cr17, PT_IASQ1(\regs)) SAVE_CR (%cr18, PT_IAOQ0(\regs)) mtctl %r0, %cr18 SAVE_CR (%cr18, PT_IAOQ1(\regs)) SAVE_CR (%cr11, PT_SAR (\regs)) SAVE_CR (%cr22, PT_PSW (\regs)) SAVE_CR (%cr19, PT_IIR (\regs)) SAVE_CR (%cr28, PT_GR1 (\regs)) SAVE_CR (%cr31, PT_GR29 (\regs)) STREG %r26, PT_GR26 (\regs) mfctl %cr29, %r26 .endm .macro rest_specials regs REST_SP (%sr0, PT_SR0 (\regs)) REST_SP (%sr1, PT_SR1 (\regs)) REST_SP (%sr2, PT_SR2 (\regs)) REST_SP (%sr3, PT_SR3 (\regs)) REST_SP (%sr4, PT_SR4 (\regs)) REST_SP (%sr5, PT_SR5 (\regs)) REST_SP (%sr6, PT_SR6 (\regs)) REST_SP (%sr7, PT_SR7 (\regs)) REST_CR (%cr17, PT_IASQ0(\regs)) REST_CR (%cr17, PT_IASQ1(\regs)) REST_CR (%cr18, PT_IAOQ0(\regs)) REST_CR (%cr18, PT_IAOQ1(\regs)) REST_CR (%cr11, PT_SAR (\regs)) REST_CR (%cr22, PT_PSW (\regs)) .endm #endif