1de6cc651SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2deae26bfSKyle McMartin /* 3deae26bfSKyle McMartin * Copyright (C) 1999 Hewlett-Packard (Frank Rowand) 4deae26bfSKyle McMartin * Copyright (C) 1999 Philipp Rumpf <prumpf@tux.org> 5deae26bfSKyle McMartin * Copyright (C) 1999 SuSE GmbH 64017b230SHelge Deller * Copyright (C) 2021 Helge Deller <deller@gmx.de> 7deae26bfSKyle McMartin */ 8deae26bfSKyle McMartin 9deae26bfSKyle McMartin #ifndef _PARISC_ASSEMBLY_H 10deae26bfSKyle McMartin #define _PARISC_ASSEMBLY_H 11deae26bfSKyle McMartin 12deae26bfSKyle McMartin #ifdef CONFIG_64BIT 13deae26bfSKyle McMartin #define RP_OFFSET 16 14deae26bfSKyle McMartin #define FRAME_SIZE 128 15deae26bfSKyle McMartin #define CALLEE_REG_FRAME_SIZE 144 16c8921d72SHelge Deller #define REG_SZ 8 17deae26bfSKyle McMartin #define ASM_ULONG_INSN .dword 18deae26bfSKyle McMartin #else /* CONFIG_64BIT */ 19deae26bfSKyle McMartin #define RP_OFFSET 20 20deae26bfSKyle McMartin #define FRAME_SIZE 64 21deae26bfSKyle McMartin #define CALLEE_REG_FRAME_SIZE 128 22c8921d72SHelge Deller #define REG_SZ 4 23deae26bfSKyle McMartin #define ASM_ULONG_INSN .word 24deae26bfSKyle McMartin #endif 25deae26bfSKyle McMartin 269f6cfef1SHelge Deller /* Frame alignment for 32- and 64-bit */ 279f6cfef1SHelge Deller #define FRAME_ALIGN 64 289f6cfef1SHelge Deller 294017b230SHelge Deller #define CALLEE_FLOAT_FRAME_SIZE 80 30deae26bfSKyle McMartin #define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE) 31deae26bfSKyle McMartin 32deae26bfSKyle McMartin #ifdef CONFIG_PA20 33deae26bfSKyle McMartin #define LDCW ldcw,co 34deae26bfSKyle McMartin #define BL b,l 35deae26bfSKyle McMartin # ifdef CONFIG_64BIT 361829dda0SHelge Deller # define PA_ASM_LEVEL 2.0w 37deae26bfSKyle McMartin # else 381829dda0SHelge Deller # define PA_ASM_LEVEL 2.0 39deae26bfSKyle McMartin # endif 40deae26bfSKyle McMartin #else 41deae26bfSKyle McMartin #define LDCW ldcw 42deae26bfSKyle McMartin #define BL bl 431829dda0SHelge Deller #define PA_ASM_LEVEL 1.1 44deae26bfSKyle McMartin #endif 45deae26bfSKyle McMartin 469f6cfef1SHelge Deller /* Privilege level field in the rightmost two bits of the IA queues */ 479f6cfef1SHelge Deller #define PRIV_USER 3 489f6cfef1SHelge Deller #define PRIV_KERNEL 0 499f6cfef1SHelge Deller 5046b4016fSHelge Deller /* Space register used inside kernel */ 5146b4016fSHelge Deller #define SR_KERNEL 0 5246b4016fSHelge Deller #define SR_TEMP1 1 5346b4016fSHelge Deller #define SR_TEMP2 2 5446b4016fSHelge Deller #define SR_USER 3 5546b4016fSHelge Deller 56deae26bfSKyle McMartin #ifdef __ASSEMBLY__ 57deae26bfSKyle McMartin 58deae26bfSKyle McMartin #ifdef CONFIG_64BIT 594017b230SHelge Deller #define LDREG ldd 604017b230SHelge Deller #define STREG std 614017b230SHelge Deller #define LDREGX ldd,s 624017b230SHelge Deller #define LDREGM ldd,mb 634017b230SHelge Deller #define STREGM std,ma 644017b230SHelge Deller #define SHRREG shrd 654017b230SHelge Deller #define SHLREG shld 664017b230SHelge Deller #define ANDCM andcm,* 674017b230SHelge Deller #define COND(x) * ## x 684017b230SHelge Deller #else /* CONFIG_64BIT */ 694017b230SHelge Deller #define LDREG ldw 704017b230SHelge Deller #define STREG stw 714017b230SHelge Deller #define LDREGX ldwx,s 724017b230SHelge Deller #define LDREGM ldwm 734017b230SHelge Deller #define STREGM stwm 744017b230SHelge Deller #define SHRREG shr 754017b230SHelge Deller #define SHLREG shlw 764017b230SHelge Deller #define ANDCM andcm 774017b230SHelge Deller #define COND(x) x 784017b230SHelge Deller #endif 794017b230SHelge Deller 804017b230SHelge Deller #ifdef CONFIG_64BIT 81deae26bfSKyle McMartin /* the 64-bit pa gnu assembler unfortunately defaults to .level 1.1 or 2.0 so 82deae26bfSKyle McMartin * work around that for now... */ 83deae26bfSKyle McMartin .level 2.0w 84deae26bfSKyle McMartin #endif 85deae26bfSKyle McMartin 86deae26bfSKyle McMartin #include <asm/asm-offsets.h> 87deae26bfSKyle McMartin #include <asm/page.h> 88c1da90fdSHelge Deller #include <asm/types.h> 89deae26bfSKyle McMartin 90deae26bfSKyle McMartin #include <asm/asmregs.h> 91b5f73da5SSven Schnelle #include <asm/psw.h> 92deae26bfSKyle McMartin 93deae26bfSKyle McMartin /* 94deae26bfSKyle McMartin * We provide two versions of each macro to convert from physical 95deae26bfSKyle McMartin * to virtual and vice versa. The "_r1" versions take one argument 96deae26bfSKyle McMartin * register, but trashes r1 to do the conversion. The other 97deae26bfSKyle McMartin * version takes two arguments: a src and destination register. 98deae26bfSKyle McMartin * However, the source and destination registers can not be 99deae26bfSKyle McMartin * the same register. 100*6bd42452SJohn David Anglin * 101*6bd42452SJohn David Anglin * We use add,l to avoid clobbering the C/B bits in the PSW. 102deae26bfSKyle McMartin */ 103deae26bfSKyle McMartin 104deae26bfSKyle McMartin .macro tophys grvirt, grphys 105*6bd42452SJohn David Anglin ldil L%(-__PAGE_OFFSET), \grphys 106*6bd42452SJohn David Anglin addl \grvirt, \grphys, \grphys 107deae26bfSKyle McMartin .endm 108deae26bfSKyle McMartin 109deae26bfSKyle McMartin .macro tovirt grphys, grvirt 110deae26bfSKyle McMartin ldil L%(__PAGE_OFFSET), \grvirt 111*6bd42452SJohn David Anglin addl \grphys, \grvirt, \grvirt 112deae26bfSKyle McMartin .endm 113deae26bfSKyle McMartin 114deae26bfSKyle McMartin .macro tophys_r1 gr 115*6bd42452SJohn David Anglin ldil L%(-__PAGE_OFFSET), %r1 116*6bd42452SJohn David Anglin addl \gr, %r1, \gr 117deae26bfSKyle McMartin .endm 118deae26bfSKyle McMartin 119deae26bfSKyle McMartin .macro tovirt_r1 gr 120deae26bfSKyle McMartin ldil L%(__PAGE_OFFSET), %r1 121*6bd42452SJohn David Anglin addl \gr, %r1, \gr 122deae26bfSKyle McMartin .endm 123deae26bfSKyle McMartin 124deae26bfSKyle McMartin .macro delay value 125deae26bfSKyle McMartin ldil L%\value, 1 126deae26bfSKyle McMartin ldo R%\value(1), 1 127deae26bfSKyle McMartin addib,UV,n -1,1,. 128deae26bfSKyle McMartin addib,NUV,n -1,1,.+8 129deae26bfSKyle McMartin nop 130deae26bfSKyle McMartin .endm 131deae26bfSKyle McMartin 132deae26bfSKyle McMartin .macro debug value 133deae26bfSKyle McMartin .endm 134deae26bfSKyle McMartin 135deae26bfSKyle McMartin .macro shlw r, sa, t 136a45a0116SHelge Deller zdep \r, 31-(\sa), 32-(\sa), \t 137deae26bfSKyle McMartin .endm 138deae26bfSKyle McMartin 139deae26bfSKyle McMartin /* And the PA 2.0W shift left */ 140deae26bfSKyle McMartin .macro shld r, sa, t 1412cfeb9a6SHelge Deller depd,z \r, 63-(\sa), 64-(\sa), \t 142deae26bfSKyle McMartin .endm 143deae26bfSKyle McMartin 144be6aee13SHelge Deller /* Shift Right for 32-bit. Clobbers upper 32-bit on PA2.0. */ 145deae26bfSKyle McMartin .macro shr r, sa, t 1462cfeb9a6SHelge Deller extru \r, 31-(\sa), 32-(\sa), \t 147deae26bfSKyle McMartin .endm 148deae26bfSKyle McMartin 149deae26bfSKyle McMartin /* pa20w version of shift right */ 150deae26bfSKyle McMartin .macro shrd r, sa, t 1512cfeb9a6SHelge Deller extrd,u \r, 63-(\sa), 64-(\sa), \t 152deae26bfSKyle McMartin .endm 153deae26bfSKyle McMartin 154169d1a4aSHelge Deller /* Extract unsigned for 32- and 64-bit 155169d1a4aSHelge Deller * The extru instruction leaves the most significant 32 bits of the 156169d1a4aSHelge Deller * target register in an undefined state on PA 2.0 systems. */ 157169d1a4aSHelge Deller .macro extru_safe r, p, len, t 158169d1a4aSHelge Deller #ifdef CONFIG_64BIT 159169d1a4aSHelge Deller extrd,u \r, 32+(\p), \len, \t 160169d1a4aSHelge Deller #else 161169d1a4aSHelge Deller extru \r, \p, \len, \t 162169d1a4aSHelge Deller #endif 163169d1a4aSHelge Deller .endm 164169d1a4aSHelge Deller 16545458aa4SJohn David Anglin /* The depi instruction leaves the most significant 32 bits of the 16645458aa4SJohn David Anglin * target register in an undefined state on PA 2.0 systems. */ 16745458aa4SJohn David Anglin .macro depi_safe i, p, len, t 16845458aa4SJohn David Anglin #ifdef CONFIG_64BIT 16945458aa4SJohn David Anglin depdi \i, 32+(\p), \len, \t 17045458aa4SJohn David Anglin #else 17145458aa4SJohn David Anglin depi \i, \p, \len, \t 17245458aa4SJohn David Anglin #endif 17345458aa4SJohn David Anglin .endm 17445458aa4SJohn David Anglin 175cdd00fe6SHelge Deller /* The depw instruction leaves the most significant 32 bits of the 176cdd00fe6SHelge Deller * target register in an undefined state on PA 2.0 systems. */ 177cdd00fe6SHelge Deller .macro dep_safe i, p, len, t 178cdd00fe6SHelge Deller #ifdef CONFIG_64BIT 179cdd00fe6SHelge Deller depd \i, 32+(\p), \len, \t 180cdd00fe6SHelge Deller #else 181cdd00fe6SHelge Deller depw \i, \p, \len, \t 182cdd00fe6SHelge Deller #endif 183cdd00fe6SHelge Deller .endm 184cdd00fe6SHelge Deller 185deae26bfSKyle McMartin /* load 32-bit 'value' into 'reg' compensating for the ldil 186deae26bfSKyle McMartin * sign-extension when running in wide mode. 187deae26bfSKyle McMartin * WARNING!! neither 'value' nor 'reg' can be expressions 188deae26bfSKyle McMartin * containing '.'!!!! */ 189deae26bfSKyle McMartin .macro load32 value, reg 190deae26bfSKyle McMartin ldil L%\value, \reg 191deae26bfSKyle McMartin ldo R%\value(\reg), \reg 192deae26bfSKyle McMartin .endm 193deae26bfSKyle McMartin 194deae26bfSKyle McMartin .macro loadgp 195deae26bfSKyle McMartin #ifdef CONFIG_64BIT 196deae26bfSKyle McMartin ldil L%__gp, %r27 197deae26bfSKyle McMartin ldo R%__gp(%r27), %r27 198deae26bfSKyle McMartin #else 199deae26bfSKyle McMartin ldil L%$global$, %r27 200deae26bfSKyle McMartin ldo R%$global$(%r27), %r27 201deae26bfSKyle McMartin #endif 202deae26bfSKyle McMartin .endm 203deae26bfSKyle McMartin 204deae26bfSKyle McMartin #define SAVE_SP(r, where) mfsp r, %r1 ! STREG %r1, where 205deae26bfSKyle McMartin #define REST_SP(r, where) LDREG where, %r1 ! mtsp %r1, r 206deae26bfSKyle McMartin #define SAVE_CR(r, where) mfctl r, %r1 ! STREG %r1, where 207deae26bfSKyle McMartin #define REST_CR(r, where) LDREG where, %r1 ! mtctl %r1, r 208deae26bfSKyle McMartin 209deae26bfSKyle McMartin .macro save_general regs 210deae26bfSKyle McMartin STREG %r1, PT_GR1 (\regs) 211deae26bfSKyle McMartin STREG %r2, PT_GR2 (\regs) 212deae26bfSKyle McMartin STREG %r3, PT_GR3 (\regs) 213deae26bfSKyle McMartin STREG %r4, PT_GR4 (\regs) 214deae26bfSKyle McMartin STREG %r5, PT_GR5 (\regs) 215deae26bfSKyle McMartin STREG %r6, PT_GR6 (\regs) 216deae26bfSKyle McMartin STREG %r7, PT_GR7 (\regs) 217deae26bfSKyle McMartin STREG %r8, PT_GR8 (\regs) 218deae26bfSKyle McMartin STREG %r9, PT_GR9 (\regs) 219deae26bfSKyle McMartin STREG %r10, PT_GR10(\regs) 220deae26bfSKyle McMartin STREG %r11, PT_GR11(\regs) 221deae26bfSKyle McMartin STREG %r12, PT_GR12(\regs) 222deae26bfSKyle McMartin STREG %r13, PT_GR13(\regs) 223deae26bfSKyle McMartin STREG %r14, PT_GR14(\regs) 224deae26bfSKyle McMartin STREG %r15, PT_GR15(\regs) 225deae26bfSKyle McMartin STREG %r16, PT_GR16(\regs) 226deae26bfSKyle McMartin STREG %r17, PT_GR17(\regs) 227deae26bfSKyle McMartin STREG %r18, PT_GR18(\regs) 228deae26bfSKyle McMartin STREG %r19, PT_GR19(\regs) 229deae26bfSKyle McMartin STREG %r20, PT_GR20(\regs) 230deae26bfSKyle McMartin STREG %r21, PT_GR21(\regs) 231deae26bfSKyle McMartin STREG %r22, PT_GR22(\regs) 232deae26bfSKyle McMartin STREG %r23, PT_GR23(\regs) 233deae26bfSKyle McMartin STREG %r24, PT_GR24(\regs) 234deae26bfSKyle McMartin STREG %r25, PT_GR25(\regs) 235deae26bfSKyle McMartin /* r26 is saved in get_stack and used to preserve a value across virt_map */ 236deae26bfSKyle McMartin STREG %r27, PT_GR27(\regs) 237deae26bfSKyle McMartin STREG %r28, PT_GR28(\regs) 238deae26bfSKyle McMartin /* r29 is saved in get_stack and used to point to saved registers */ 239deae26bfSKyle McMartin /* r30 stack pointer saved in get_stack */ 240deae26bfSKyle McMartin STREG %r31, PT_GR31(\regs) 241deae26bfSKyle McMartin .endm 242deae26bfSKyle McMartin 243deae26bfSKyle McMartin .macro rest_general regs 244deae26bfSKyle McMartin /* r1 used as a temp in rest_stack and is restored there */ 245deae26bfSKyle McMartin LDREG PT_GR2 (\regs), %r2 246deae26bfSKyle McMartin LDREG PT_GR3 (\regs), %r3 247deae26bfSKyle McMartin LDREG PT_GR4 (\regs), %r4 248deae26bfSKyle McMartin LDREG PT_GR5 (\regs), %r5 249deae26bfSKyle McMartin LDREG PT_GR6 (\regs), %r6 250deae26bfSKyle McMartin LDREG PT_GR7 (\regs), %r7 251deae26bfSKyle McMartin LDREG PT_GR8 (\regs), %r8 252deae26bfSKyle McMartin LDREG PT_GR9 (\regs), %r9 253deae26bfSKyle McMartin LDREG PT_GR10(\regs), %r10 254deae26bfSKyle McMartin LDREG PT_GR11(\regs), %r11 255deae26bfSKyle McMartin LDREG PT_GR12(\regs), %r12 256deae26bfSKyle McMartin LDREG PT_GR13(\regs), %r13 257deae26bfSKyle McMartin LDREG PT_GR14(\regs), %r14 258deae26bfSKyle McMartin LDREG PT_GR15(\regs), %r15 259deae26bfSKyle McMartin LDREG PT_GR16(\regs), %r16 260deae26bfSKyle McMartin LDREG PT_GR17(\regs), %r17 261deae26bfSKyle McMartin LDREG PT_GR18(\regs), %r18 262deae26bfSKyle McMartin LDREG PT_GR19(\regs), %r19 263deae26bfSKyle McMartin LDREG PT_GR20(\regs), %r20 264deae26bfSKyle McMartin LDREG PT_GR21(\regs), %r21 265deae26bfSKyle McMartin LDREG PT_GR22(\regs), %r22 266deae26bfSKyle McMartin LDREG PT_GR23(\regs), %r23 267deae26bfSKyle McMartin LDREG PT_GR24(\regs), %r24 268deae26bfSKyle McMartin LDREG PT_GR25(\regs), %r25 269deae26bfSKyle McMartin LDREG PT_GR26(\regs), %r26 270deae26bfSKyle McMartin LDREG PT_GR27(\regs), %r27 271deae26bfSKyle McMartin LDREG PT_GR28(\regs), %r28 272deae26bfSKyle McMartin /* r29 points to register save area, and is restored in rest_stack */ 273deae26bfSKyle McMartin /* r30 stack pointer restored in rest_stack */ 274deae26bfSKyle McMartin LDREG PT_GR31(\regs), %r31 275deae26bfSKyle McMartin .endm 276deae26bfSKyle McMartin 277deae26bfSKyle McMartin .macro save_fp regs 278deae26bfSKyle McMartin fstd,ma %fr0, 8(\regs) 279deae26bfSKyle McMartin fstd,ma %fr1, 8(\regs) 280deae26bfSKyle McMartin fstd,ma %fr2, 8(\regs) 281deae26bfSKyle McMartin fstd,ma %fr3, 8(\regs) 282deae26bfSKyle McMartin fstd,ma %fr4, 8(\regs) 283deae26bfSKyle McMartin fstd,ma %fr5, 8(\regs) 284deae26bfSKyle McMartin fstd,ma %fr6, 8(\regs) 285deae26bfSKyle McMartin fstd,ma %fr7, 8(\regs) 286deae26bfSKyle McMartin fstd,ma %fr8, 8(\regs) 287deae26bfSKyle McMartin fstd,ma %fr9, 8(\regs) 288deae26bfSKyle McMartin fstd,ma %fr10, 8(\regs) 289deae26bfSKyle McMartin fstd,ma %fr11, 8(\regs) 290deae26bfSKyle McMartin fstd,ma %fr12, 8(\regs) 291deae26bfSKyle McMartin fstd,ma %fr13, 8(\regs) 292deae26bfSKyle McMartin fstd,ma %fr14, 8(\regs) 293deae26bfSKyle McMartin fstd,ma %fr15, 8(\regs) 294deae26bfSKyle McMartin fstd,ma %fr16, 8(\regs) 295deae26bfSKyle McMartin fstd,ma %fr17, 8(\regs) 296deae26bfSKyle McMartin fstd,ma %fr18, 8(\regs) 297deae26bfSKyle McMartin fstd,ma %fr19, 8(\regs) 298deae26bfSKyle McMartin fstd,ma %fr20, 8(\regs) 299deae26bfSKyle McMartin fstd,ma %fr21, 8(\regs) 300deae26bfSKyle McMartin fstd,ma %fr22, 8(\regs) 301deae26bfSKyle McMartin fstd,ma %fr23, 8(\regs) 302deae26bfSKyle McMartin fstd,ma %fr24, 8(\regs) 303deae26bfSKyle McMartin fstd,ma %fr25, 8(\regs) 304deae26bfSKyle McMartin fstd,ma %fr26, 8(\regs) 305deae26bfSKyle McMartin fstd,ma %fr27, 8(\regs) 306deae26bfSKyle McMartin fstd,ma %fr28, 8(\regs) 307deae26bfSKyle McMartin fstd,ma %fr29, 8(\regs) 308deae26bfSKyle McMartin fstd,ma %fr30, 8(\regs) 309deae26bfSKyle McMartin fstd %fr31, 0(\regs) 310deae26bfSKyle McMartin .endm 311deae26bfSKyle McMartin 312deae26bfSKyle McMartin .macro rest_fp regs 313deae26bfSKyle McMartin fldd 0(\regs), %fr31 314deae26bfSKyle McMartin fldd,mb -8(\regs), %fr30 315deae26bfSKyle McMartin fldd,mb -8(\regs), %fr29 316deae26bfSKyle McMartin fldd,mb -8(\regs), %fr28 317deae26bfSKyle McMartin fldd,mb -8(\regs), %fr27 318deae26bfSKyle McMartin fldd,mb -8(\regs), %fr26 319deae26bfSKyle McMartin fldd,mb -8(\regs), %fr25 320deae26bfSKyle McMartin fldd,mb -8(\regs), %fr24 321deae26bfSKyle McMartin fldd,mb -8(\regs), %fr23 322deae26bfSKyle McMartin fldd,mb -8(\regs), %fr22 323deae26bfSKyle McMartin fldd,mb -8(\regs), %fr21 324deae26bfSKyle McMartin fldd,mb -8(\regs), %fr20 325deae26bfSKyle McMartin fldd,mb -8(\regs), %fr19 326deae26bfSKyle McMartin fldd,mb -8(\regs), %fr18 327deae26bfSKyle McMartin fldd,mb -8(\regs), %fr17 328deae26bfSKyle McMartin fldd,mb -8(\regs), %fr16 329deae26bfSKyle McMartin fldd,mb -8(\regs), %fr15 330deae26bfSKyle McMartin fldd,mb -8(\regs), %fr14 331deae26bfSKyle McMartin fldd,mb -8(\regs), %fr13 332deae26bfSKyle McMartin fldd,mb -8(\regs), %fr12 333deae26bfSKyle McMartin fldd,mb -8(\regs), %fr11 334deae26bfSKyle McMartin fldd,mb -8(\regs), %fr10 335deae26bfSKyle McMartin fldd,mb -8(\regs), %fr9 336deae26bfSKyle McMartin fldd,mb -8(\regs), %fr8 337deae26bfSKyle McMartin fldd,mb -8(\regs), %fr7 338deae26bfSKyle McMartin fldd,mb -8(\regs), %fr6 339deae26bfSKyle McMartin fldd,mb -8(\regs), %fr5 340deae26bfSKyle McMartin fldd,mb -8(\regs), %fr4 341deae26bfSKyle McMartin fldd,mb -8(\regs), %fr3 342deae26bfSKyle McMartin fldd,mb -8(\regs), %fr2 343deae26bfSKyle McMartin fldd,mb -8(\regs), %fr1 344deae26bfSKyle McMartin fldd,mb -8(\regs), %fr0 345deae26bfSKyle McMartin .endm 346deae26bfSKyle McMartin 347deae26bfSKyle McMartin .macro callee_save_float 348deae26bfSKyle McMartin fstd,ma %fr12, 8(%r30) 349deae26bfSKyle McMartin fstd,ma %fr13, 8(%r30) 350deae26bfSKyle McMartin fstd,ma %fr14, 8(%r30) 351deae26bfSKyle McMartin fstd,ma %fr15, 8(%r30) 352deae26bfSKyle McMartin fstd,ma %fr16, 8(%r30) 353deae26bfSKyle McMartin fstd,ma %fr17, 8(%r30) 354deae26bfSKyle McMartin fstd,ma %fr18, 8(%r30) 355deae26bfSKyle McMartin fstd,ma %fr19, 8(%r30) 356deae26bfSKyle McMartin fstd,ma %fr20, 8(%r30) 357deae26bfSKyle McMartin fstd,ma %fr21, 8(%r30) 358deae26bfSKyle McMartin .endm 359deae26bfSKyle McMartin 360deae26bfSKyle McMartin .macro callee_rest_float 361deae26bfSKyle McMartin fldd,mb -8(%r30), %fr21 362deae26bfSKyle McMartin fldd,mb -8(%r30), %fr20 363deae26bfSKyle McMartin fldd,mb -8(%r30), %fr19 364deae26bfSKyle McMartin fldd,mb -8(%r30), %fr18 365deae26bfSKyle McMartin fldd,mb -8(%r30), %fr17 366deae26bfSKyle McMartin fldd,mb -8(%r30), %fr16 367deae26bfSKyle McMartin fldd,mb -8(%r30), %fr15 368deae26bfSKyle McMartin fldd,mb -8(%r30), %fr14 369deae26bfSKyle McMartin fldd,mb -8(%r30), %fr13 370deae26bfSKyle McMartin fldd,mb -8(%r30), %fr12 371deae26bfSKyle McMartin .endm 372deae26bfSKyle McMartin 373deae26bfSKyle McMartin #ifdef CONFIG_64BIT 374deae26bfSKyle McMartin .macro callee_save 375deae26bfSKyle McMartin std,ma %r3, CALLEE_REG_FRAME_SIZE(%r30) 376deae26bfSKyle McMartin mfctl %cr27, %r3 377deae26bfSKyle McMartin std %r4, -136(%r30) 378deae26bfSKyle McMartin std %r5, -128(%r30) 379deae26bfSKyle McMartin std %r6, -120(%r30) 380deae26bfSKyle McMartin std %r7, -112(%r30) 381deae26bfSKyle McMartin std %r8, -104(%r30) 382deae26bfSKyle McMartin std %r9, -96(%r30) 383deae26bfSKyle McMartin std %r10, -88(%r30) 384deae26bfSKyle McMartin std %r11, -80(%r30) 385deae26bfSKyle McMartin std %r12, -72(%r30) 386deae26bfSKyle McMartin std %r13, -64(%r30) 387deae26bfSKyle McMartin std %r14, -56(%r30) 388deae26bfSKyle McMartin std %r15, -48(%r30) 389deae26bfSKyle McMartin std %r16, -40(%r30) 390deae26bfSKyle McMartin std %r17, -32(%r30) 391deae26bfSKyle McMartin std %r18, -24(%r30) 392deae26bfSKyle McMartin std %r3, -16(%r30) 393deae26bfSKyle McMartin .endm 394deae26bfSKyle McMartin 395deae26bfSKyle McMartin .macro callee_rest 396deae26bfSKyle McMartin ldd -16(%r30), %r3 397deae26bfSKyle McMartin ldd -24(%r30), %r18 398deae26bfSKyle McMartin ldd -32(%r30), %r17 399deae26bfSKyle McMartin ldd -40(%r30), %r16 400deae26bfSKyle McMartin ldd -48(%r30), %r15 401deae26bfSKyle McMartin ldd -56(%r30), %r14 402deae26bfSKyle McMartin ldd -64(%r30), %r13 403deae26bfSKyle McMartin ldd -72(%r30), %r12 404deae26bfSKyle McMartin ldd -80(%r30), %r11 405deae26bfSKyle McMartin ldd -88(%r30), %r10 406deae26bfSKyle McMartin ldd -96(%r30), %r9 407deae26bfSKyle McMartin ldd -104(%r30), %r8 408deae26bfSKyle McMartin ldd -112(%r30), %r7 409deae26bfSKyle McMartin ldd -120(%r30), %r6 410deae26bfSKyle McMartin ldd -128(%r30), %r5 411deae26bfSKyle McMartin ldd -136(%r30), %r4 412deae26bfSKyle McMartin mtctl %r3, %cr27 413deae26bfSKyle McMartin ldd,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3 414deae26bfSKyle McMartin .endm 415deae26bfSKyle McMartin 416deae26bfSKyle McMartin #else /* ! CONFIG_64BIT */ 417deae26bfSKyle McMartin 418deae26bfSKyle McMartin .macro callee_save 419deae26bfSKyle McMartin stw,ma %r3, CALLEE_REG_FRAME_SIZE(%r30) 420deae26bfSKyle McMartin mfctl %cr27, %r3 421deae26bfSKyle McMartin stw %r4, -124(%r30) 422deae26bfSKyle McMartin stw %r5, -120(%r30) 423deae26bfSKyle McMartin stw %r6, -116(%r30) 424deae26bfSKyle McMartin stw %r7, -112(%r30) 425deae26bfSKyle McMartin stw %r8, -108(%r30) 426deae26bfSKyle McMartin stw %r9, -104(%r30) 427deae26bfSKyle McMartin stw %r10, -100(%r30) 428deae26bfSKyle McMartin stw %r11, -96(%r30) 429deae26bfSKyle McMartin stw %r12, -92(%r30) 430deae26bfSKyle McMartin stw %r13, -88(%r30) 431deae26bfSKyle McMartin stw %r14, -84(%r30) 432deae26bfSKyle McMartin stw %r15, -80(%r30) 433deae26bfSKyle McMartin stw %r16, -76(%r30) 434deae26bfSKyle McMartin stw %r17, -72(%r30) 435deae26bfSKyle McMartin stw %r18, -68(%r30) 436deae26bfSKyle McMartin stw %r3, -64(%r30) 437deae26bfSKyle McMartin .endm 438deae26bfSKyle McMartin 439deae26bfSKyle McMartin .macro callee_rest 440deae26bfSKyle McMartin ldw -64(%r30), %r3 441deae26bfSKyle McMartin ldw -68(%r30), %r18 442deae26bfSKyle McMartin ldw -72(%r30), %r17 443deae26bfSKyle McMartin ldw -76(%r30), %r16 444deae26bfSKyle McMartin ldw -80(%r30), %r15 445deae26bfSKyle McMartin ldw -84(%r30), %r14 446deae26bfSKyle McMartin ldw -88(%r30), %r13 447deae26bfSKyle McMartin ldw -92(%r30), %r12 448deae26bfSKyle McMartin ldw -96(%r30), %r11 449deae26bfSKyle McMartin ldw -100(%r30), %r10 450deae26bfSKyle McMartin ldw -104(%r30), %r9 451deae26bfSKyle McMartin ldw -108(%r30), %r8 452deae26bfSKyle McMartin ldw -112(%r30), %r7 453deae26bfSKyle McMartin ldw -116(%r30), %r6 454deae26bfSKyle McMartin ldw -120(%r30), %r5 455deae26bfSKyle McMartin ldw -124(%r30), %r4 456deae26bfSKyle McMartin mtctl %r3, %cr27 457deae26bfSKyle McMartin ldw,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3 458deae26bfSKyle McMartin .endm 459deae26bfSKyle McMartin #endif /* ! CONFIG_64BIT */ 460deae26bfSKyle McMartin 461deae26bfSKyle McMartin .macro save_specials regs 462deae26bfSKyle McMartin 463deae26bfSKyle McMartin SAVE_SP (%sr0, PT_SR0 (\regs)) 464deae26bfSKyle McMartin SAVE_SP (%sr1, PT_SR1 (\regs)) 465deae26bfSKyle McMartin SAVE_SP (%sr2, PT_SR2 (\regs)) 466deae26bfSKyle McMartin SAVE_SP (%sr3, PT_SR3 (\regs)) 467deae26bfSKyle McMartin SAVE_SP (%sr4, PT_SR4 (\regs)) 468deae26bfSKyle McMartin SAVE_SP (%sr5, PT_SR5 (\regs)) 469deae26bfSKyle McMartin SAVE_SP (%sr6, PT_SR6 (\regs)) 470deae26bfSKyle McMartin 471deae26bfSKyle McMartin SAVE_CR (%cr17, PT_IASQ0(\regs)) 472deae26bfSKyle McMartin mtctl %r0, %cr17 473deae26bfSKyle McMartin SAVE_CR (%cr17, PT_IASQ1(\regs)) 474deae26bfSKyle McMartin 475deae26bfSKyle McMartin SAVE_CR (%cr18, PT_IAOQ0(\regs)) 476deae26bfSKyle McMartin mtctl %r0, %cr18 477deae26bfSKyle McMartin SAVE_CR (%cr18, PT_IAOQ1(\regs)) 478deae26bfSKyle McMartin 479deae26bfSKyle McMartin #ifdef CONFIG_64BIT 480deae26bfSKyle McMartin /* cr11 (sar) is a funny one. 5 bits on PA1.1 and 6 bit on PA2.0 481deae26bfSKyle McMartin * For PA2.0 mtsar or mtctl always write 6 bits, but mfctl only 482deae26bfSKyle McMartin * reads 5 bits. Use mfctl,w to read all six bits. Otherwise 483deae26bfSKyle McMartin * we lose the 6th bit on a save/restore over interrupt. 484deae26bfSKyle McMartin */ 485deae26bfSKyle McMartin mfctl,w %cr11, %r1 486deae26bfSKyle McMartin STREG %r1, PT_SAR (\regs) 487deae26bfSKyle McMartin #else 488deae26bfSKyle McMartin SAVE_CR (%cr11, PT_SAR (\regs)) 489deae26bfSKyle McMartin #endif 490deae26bfSKyle McMartin SAVE_CR (%cr19, PT_IIR (\regs)) 491deae26bfSKyle McMartin 492deae26bfSKyle McMartin /* 493deae26bfSKyle McMartin * Code immediately following this macro (in intr_save) relies 494deae26bfSKyle McMartin * on r8 containing ipsw. 495deae26bfSKyle McMartin */ 496deae26bfSKyle McMartin mfctl %cr22, %r8 497deae26bfSKyle McMartin STREG %r8, PT_PSW(\regs) 498deae26bfSKyle McMartin .endm 499deae26bfSKyle McMartin 500deae26bfSKyle McMartin .macro rest_specials regs 501deae26bfSKyle McMartin 502deae26bfSKyle McMartin REST_SP (%sr0, PT_SR0 (\regs)) 503deae26bfSKyle McMartin REST_SP (%sr1, PT_SR1 (\regs)) 504deae26bfSKyle McMartin REST_SP (%sr2, PT_SR2 (\regs)) 505deae26bfSKyle McMartin REST_SP (%sr3, PT_SR3 (\regs)) 506deae26bfSKyle McMartin REST_SP (%sr4, PT_SR4 (\regs)) 507deae26bfSKyle McMartin REST_SP (%sr5, PT_SR5 (\regs)) 508deae26bfSKyle McMartin REST_SP (%sr6, PT_SR6 (\regs)) 509deae26bfSKyle McMartin REST_SP (%sr7, PT_SR7 (\regs)) 510deae26bfSKyle McMartin 511deae26bfSKyle McMartin REST_CR (%cr17, PT_IASQ0(\regs)) 512deae26bfSKyle McMartin REST_CR (%cr17, PT_IASQ1(\regs)) 513deae26bfSKyle McMartin 514deae26bfSKyle McMartin REST_CR (%cr18, PT_IAOQ0(\regs)) 515deae26bfSKyle McMartin REST_CR (%cr18, PT_IAOQ1(\regs)) 516deae26bfSKyle McMartin 517deae26bfSKyle McMartin REST_CR (%cr11, PT_SAR (\regs)) 518deae26bfSKyle McMartin 519deae26bfSKyle McMartin REST_CR (%cr22, PT_PSW (\regs)) 520deae26bfSKyle McMartin .endm 521deae26bfSKyle McMartin 522deae26bfSKyle McMartin 523deae26bfSKyle McMartin /* First step to create a "relied upon translation" 524deae26bfSKyle McMartin * See PA 2.0 Arch. page F-4 and F-5. 525deae26bfSKyle McMartin * 526deae26bfSKyle McMartin * The ssm was originally necessary due to a "PCxT bug". 527deae26bfSKyle McMartin * But someone decided it needed to be added to the architecture 528deae26bfSKyle McMartin * and this "feature" went into rev3 of PA-RISC 1.1 Arch Manual. 529deae26bfSKyle McMartin * It's been carried forward into PA 2.0 Arch as well. :^( 530deae26bfSKyle McMartin * 531deae26bfSKyle McMartin * "ssm 0,%r0" is a NOP with side effects (prefetch barrier). 532deae26bfSKyle McMartin * rsm/ssm prevents the ifetch unit from speculatively fetching 533deae26bfSKyle McMartin * instructions past this line in the code stream. 534deae26bfSKyle McMartin * PA 2.0 processor will single step all insn in the same QUAD (4 insn). 535deae26bfSKyle McMartin */ 536deae26bfSKyle McMartin .macro pcxt_ssm_bug 537deae26bfSKyle McMartin rsm PSW_SM_I,%r0 538deae26bfSKyle McMartin nop /* 1 */ 539deae26bfSKyle McMartin nop /* 2 */ 540deae26bfSKyle McMartin nop /* 3 */ 541deae26bfSKyle McMartin nop /* 4 */ 542deae26bfSKyle McMartin nop /* 5 */ 543deae26bfSKyle McMartin nop /* 6 */ 544deae26bfSKyle McMartin nop /* 7 */ 545deae26bfSKyle McMartin .endm 546deae26bfSKyle McMartin 547b5f73da5SSven Schnelle /* Switch to virtual mapping, trashing only %r1 */ 548b5f73da5SSven Schnelle .macro virt_map 549b5f73da5SSven Schnelle /* pcxt_ssm_bug */ 550b5f73da5SSven Schnelle rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */ 551b5f73da5SSven Schnelle mtsp %r0, %sr4 552b5f73da5SSven Schnelle mtsp %r0, %sr5 553b5f73da5SSven Schnelle mtsp %r0, %sr6 554b5f73da5SSven Schnelle tovirt_r1 %r29 555b5f73da5SSven Schnelle load32 KERNEL_PSW, %r1 556b5f73da5SSven Schnelle 557b5f73da5SSven Schnelle rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */ 558b5f73da5SSven Schnelle mtctl %r0, %cr17 /* Clear IIASQ tail */ 559b5f73da5SSven Schnelle mtctl %r0, %cr17 /* Clear IIASQ head */ 560b5f73da5SSven Schnelle mtctl %r1, %ipsw 561b5f73da5SSven Schnelle load32 4f, %r1 562b5f73da5SSven Schnelle mtctl %r1, %cr18 /* Set IIAOQ tail */ 563b5f73da5SSven Schnelle ldo 4(%r1), %r1 564b5f73da5SSven Schnelle mtctl %r1, %cr18 /* Set IIAOQ head */ 565b5f73da5SSven Schnelle rfir 566b5f73da5SSven Schnelle nop 567b5f73da5SSven Schnelle 4: 568b5f73da5SSven Schnelle .endm 569b5f73da5SSven Schnelle 570b5f73da5SSven Schnelle 57161dbbaebSHelge Deller /* 57261dbbaebSHelge Deller * ASM_EXCEPTIONTABLE_ENTRY 57361dbbaebSHelge Deller * 57461dbbaebSHelge Deller * Creates an exception table entry. 57561dbbaebSHelge Deller * Do not convert to a assembler macro. This won't work. 57661dbbaebSHelge Deller */ 57761dbbaebSHelge Deller #define ASM_EXCEPTIONTABLE_ENTRY(fault_addr, except_addr) \ 57861dbbaebSHelge Deller .section __ex_table,"aw" ! \ 579bf204012SHelge Deller .align 4 ! \ 5800de79858SHelge Deller .word (fault_addr - .), (except_addr - .) ! \ 581fa69a806SHelge Deller or %r0,%r0,%r0 ! \ 58261dbbaebSHelge Deller .previous 58361dbbaebSHelge Deller 58461dbbaebSHelge Deller 585deae26bfSKyle McMartin #endif /* __ASSEMBLY__ */ 586deae26bfSKyle McMartin #endif 587