15b3b1688SDavid Daney/* 25b3b1688SDavid Daney * This file is subject to the terms and conditions of the GNU General Public 35b3b1688SDavid Daney * License. See the file "COPYING" in the main directory of this archive 45b3b1688SDavid Daney * for more details. 55b3b1688SDavid Daney * 65b3b1688SDavid Daney * Copyright (C) 1994, 1995, 1996, 1998, 1999, 2002, 2003 Ralf Baechle 779add627SJustin P. Mattock * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 85b3b1688SDavid Daney * Copyright (C) 1994, 1995, 1996, by Andreas Busse 95b3b1688SDavid Daney * Copyright (C) 1999 Silicon Graphics, Inc. 105b3b1688SDavid Daney * Copyright (C) 2000 MIPS Technologies, Inc. 115b3b1688SDavid Daney * written by Carsten Langgaard, carstenl@mips.com 125b3b1688SDavid Daney */ 135b3b1688SDavid Daney 14*a36d8225SDavid Daney#define USE_ALTERNATE_RESUME_IMPL 1 15*a36d8225SDavid Daney .set push 16*a36d8225SDavid Daney .set arch=mips64r2 17*a36d8225SDavid Daney#include "r4k_switch.S" 18*a36d8225SDavid Daney .set pop 195b3b1688SDavid Daney/* 205b3b1688SDavid Daney * task_struct *resume(task_struct *prev, task_struct *next, 212dd17030SLeonid Yegoshin * struct thread_info *next_ti, int usedfpu) 225b3b1688SDavid Daney */ 235b3b1688SDavid Daney .align 7 245b3b1688SDavid Daney LEAF(resume) 255b3b1688SDavid Daney .set arch=octeon 265b3b1688SDavid Daney mfc0 t1, CP0_STATUS 275b3b1688SDavid Daney LONG_S t1, THREAD_STATUS(a0) 285b3b1688SDavid Daney cpu_save_nonscratch a0 295b3b1688SDavid Daney LONG_S ra, THREAD_REG31(a0) 305b3b1688SDavid Daney 31*a36d8225SDavid Daney /* 32*a36d8225SDavid Daney * check if we need to save FPU registers 33*a36d8225SDavid Daney */ 34*a36d8225SDavid Daney PTR_L t3, TASK_THREAD_INFO(a0) 35*a36d8225SDavid Daney LONG_L t0, TI_FLAGS(t3) 36*a36d8225SDavid Daney li t1, _TIF_USEDFPU 37*a36d8225SDavid Daney and t2, t0, t1 38*a36d8225SDavid Daney beqz t2, 1f 39*a36d8225SDavid Daney nor t1, zero, t1 40*a36d8225SDavid Daney 41*a36d8225SDavid Daney and t0, t0, t1 42*a36d8225SDavid Daney LONG_S t0, TI_FLAGS(t3) 43*a36d8225SDavid Daney 44*a36d8225SDavid Daney /* 45*a36d8225SDavid Daney * clear saved user stack CU1 bit 46*a36d8225SDavid Daney */ 47*a36d8225SDavid Daney LONG_L t0, ST_OFF(t3) 48*a36d8225SDavid Daney li t1, ~ST0_CU1 49*a36d8225SDavid Daney and t0, t0, t1 50*a36d8225SDavid Daney LONG_S t0, ST_OFF(t3) 51*a36d8225SDavid Daney 52*a36d8225SDavid Daney .set push 53*a36d8225SDavid Daney .set arch=mips64r2 54*a36d8225SDavid Daney fpu_save_double a0 t0 t1 # c0_status passed in t0 55*a36d8225SDavid Daney # clobbers t1 56*a36d8225SDavid Daney .set pop 57*a36d8225SDavid Daney1: 58*a36d8225SDavid Daney 59*a36d8225SDavid Daney /* check if we need to save COP2 registers */ 60*a36d8225SDavid Daney PTR_L t2, TASK_THREAD_INFO(a0) 61*a36d8225SDavid Daney LONG_L t0, ST_OFF(t2) 62*a36d8225SDavid Daney bbit0 t0, 30, 1f 63*a36d8225SDavid Daney 64*a36d8225SDavid Daney /* Disable COP2 in the stored process state */ 65*a36d8225SDavid Daney li t1, ST0_CU2 66*a36d8225SDavid Daney xor t0, t1 67*a36d8225SDavid Daney LONG_S t0, ST_OFF(t2) 68*a36d8225SDavid Daney 69*a36d8225SDavid Daney /* Enable COP2 so we can save it */ 70*a36d8225SDavid Daney mfc0 t0, CP0_STATUS 71*a36d8225SDavid Daney or t0, t1 72*a36d8225SDavid Daney mtc0 t0, CP0_STATUS 73*a36d8225SDavid Daney 74*a36d8225SDavid Daney /* Save COP2 */ 75*a36d8225SDavid Daney daddu a0, THREAD_CP2 76*a36d8225SDavid Daney jal octeon_cop2_save 77*a36d8225SDavid Daney dsubu a0, THREAD_CP2 78*a36d8225SDavid Daney 79*a36d8225SDavid Daney /* Disable COP2 now that we are done */ 80*a36d8225SDavid Daney mfc0 t0, CP0_STATUS 81*a36d8225SDavid Daney li t1, ST0_CU2 82*a36d8225SDavid Daney xor t0, t1 83*a36d8225SDavid Daney mtc0 t0, CP0_STATUS 84*a36d8225SDavid Daney 85*a36d8225SDavid Daney1: 865b3b1688SDavid Daney#if CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE > 0 875b3b1688SDavid Daney /* Check if we need to store CVMSEG state */ 885b3b1688SDavid Daney mfc0 t0, $11,7 /* CvmMemCtl */ 895b3b1688SDavid Daney bbit0 t0, 6, 3f /* Is user access enabled? */ 905b3b1688SDavid Daney 915b3b1688SDavid Daney /* Store the CVMSEG state */ 925b3b1688SDavid Daney /* Extract the size of CVMSEG */ 935b3b1688SDavid Daney andi t0, 0x3f 945b3b1688SDavid Daney /* Multiply * (cache line size/sizeof(long)/2) */ 955b3b1688SDavid Daney sll t0, 7-LONGLOG-1 965b3b1688SDavid Daney li t1, -32768 /* Base address of CVMSEG */ 975b3b1688SDavid Daney LONG_ADDI t2, a0, THREAD_CVMSEG /* Where to store CVMSEG to */ 985b3b1688SDavid Daney synciobdma 995b3b1688SDavid Daney2: 1005b3b1688SDavid Daney .set noreorder 1015b3b1688SDavid Daney LONG_L t8, 0(t1) /* Load from CVMSEG */ 1025b3b1688SDavid Daney subu t0, 1 /* Decrement loop var */ 1035b3b1688SDavid Daney LONG_L t9, LONGSIZE(t1)/* Load from CVMSEG */ 1045b3b1688SDavid Daney LONG_ADDU t1, LONGSIZE*2 /* Increment loc in CVMSEG */ 1055b3b1688SDavid Daney LONG_S t8, 0(t2) /* Store CVMSEG to thread storage */ 1065b3b1688SDavid Daney LONG_ADDU t2, LONGSIZE*2 /* Increment loc in thread storage */ 1075b3b1688SDavid Daney bnez t0, 2b /* Loop until we've copied it all */ 1085b3b1688SDavid Daney LONG_S t9, -LONGSIZE(t2)/* Store CVMSEG to thread storage */ 1095b3b1688SDavid Daney .set reorder 1105b3b1688SDavid Daney 1115b3b1688SDavid Daney /* Disable access to CVMSEG */ 1125b3b1688SDavid Daney mfc0 t0, $11,7 /* CvmMemCtl */ 1135b3b1688SDavid Daney xori t0, t0, 0x40 /* Bit 6 is CVMSEG user enable */ 1145b3b1688SDavid Daney mtc0 t0, $11,7 /* CvmMemCtl */ 1155b3b1688SDavid Daney#endif 1165b3b1688SDavid Daney3: 1171400eb65SGregory Fong 1181400eb65SGregory Fong#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP) 1198b3c569aSJames Hogan PTR_LA t8, __stack_chk_guard 1201400eb65SGregory Fong LONG_L t9, TASK_STACK_CANARY(a1) 1211400eb65SGregory Fong LONG_S t9, 0(t8) 1221400eb65SGregory Fong#endif 1231400eb65SGregory Fong 1245b3b1688SDavid Daney /* 1255b3b1688SDavid Daney * The order of restoring the registers takes care of the race 1265b3b1688SDavid Daney * updating $28, $29 and kernelsp without disabling ints. 1275b3b1688SDavid Daney */ 1285b3b1688SDavid Daney move $28, a2 1295b3b1688SDavid Daney cpu_restore_nonscratch a1 1305b3b1688SDavid Daney 131*a36d8225SDavid Daney PTR_ADDU t0, $28, _THREAD_SIZE - 32 1325b3b1688SDavid Daney set_saved_sp t0, t1, t2 1335b3b1688SDavid Daney 1345b3b1688SDavid Daney mfc0 t1, CP0_STATUS /* Do we really need this? */ 1355b3b1688SDavid Daney li a3, 0xff01 1365b3b1688SDavid Daney and t1, a3 1375b3b1688SDavid Daney LONG_L a2, THREAD_STATUS(a1) 1385b3b1688SDavid Daney nor a3, $0, a3 1395b3b1688SDavid Daney and a2, a3 1405b3b1688SDavid Daney or a2, t1 1415b3b1688SDavid Daney mtc0 a2, CP0_STATUS 1425b3b1688SDavid Daney move v0, a0 1435b3b1688SDavid Daney jr ra 1445b3b1688SDavid Daney END(resume) 1455b3b1688SDavid Daney 1465b3b1688SDavid Daney/* 1475b3b1688SDavid Daney * void octeon_cop2_save(struct octeon_cop2_state *a0) 1485b3b1688SDavid Daney */ 1495b3b1688SDavid Daney .align 7 1505b3b1688SDavid Daney LEAF(octeon_cop2_save) 1515b3b1688SDavid Daney 1525b3b1688SDavid Daney dmfc0 t9, $9,7 /* CvmCtl register. */ 1535b3b1688SDavid Daney 1545b3b1688SDavid Daney /* Save the COP2 CRC state */ 1555b3b1688SDavid Daney dmfc2 t0, 0x0201 1565b3b1688SDavid Daney dmfc2 t1, 0x0202 1575b3b1688SDavid Daney dmfc2 t2, 0x0200 1585b3b1688SDavid Daney sd t0, OCTEON_CP2_CRC_IV(a0) 1595b3b1688SDavid Daney sd t1, OCTEON_CP2_CRC_LENGTH(a0) 1605b3b1688SDavid Daney sd t2, OCTEON_CP2_CRC_POLY(a0) 1615b3b1688SDavid Daney /* Skip next instructions if CvmCtl[NODFA_CP2] set */ 1625b3b1688SDavid Daney bbit1 t9, 28, 1f 1635b3b1688SDavid Daney 1645b3b1688SDavid Daney /* Save the LLM state */ 1655b3b1688SDavid Daney dmfc2 t0, 0x0402 1665b3b1688SDavid Daney dmfc2 t1, 0x040A 1675b3b1688SDavid Daney sd t0, OCTEON_CP2_LLM_DAT(a0) 1685b3b1688SDavid Daney sd t1, OCTEON_CP2_LLM_DAT+8(a0) 1695b3b1688SDavid Daney 1705b3b1688SDavid Daney1: bbit1 t9, 26, 3f /* done if CvmCtl[NOCRYPTO] set */ 1715b3b1688SDavid Daney 1725b3b1688SDavid Daney /* Save the COP2 crypto state */ 1735b3b1688SDavid Daney /* this part is mostly common to both pass 1 and later revisions */ 1745b3b1688SDavid Daney dmfc2 t0, 0x0084 1755b3b1688SDavid Daney dmfc2 t1, 0x0080 1765b3b1688SDavid Daney dmfc2 t2, 0x0081 1775b3b1688SDavid Daney dmfc2 t3, 0x0082 1785b3b1688SDavid Daney sd t0, OCTEON_CP2_3DES_IV(a0) 1795b3b1688SDavid Daney dmfc2 t0, 0x0088 1805b3b1688SDavid Daney sd t1, OCTEON_CP2_3DES_KEY(a0) 1815b3b1688SDavid Daney dmfc2 t1, 0x0111 /* only necessary for pass 1 */ 1825b3b1688SDavid Daney sd t2, OCTEON_CP2_3DES_KEY+8(a0) 1835b3b1688SDavid Daney dmfc2 t2, 0x0102 1845b3b1688SDavid Daney sd t3, OCTEON_CP2_3DES_KEY+16(a0) 1855b3b1688SDavid Daney dmfc2 t3, 0x0103 1865b3b1688SDavid Daney sd t0, OCTEON_CP2_3DES_RESULT(a0) 1875b3b1688SDavid Daney dmfc2 t0, 0x0104 1885b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_INP0(a0) /* only necessary for pass 1 */ 1895b3b1688SDavid Daney dmfc2 t1, 0x0105 1905b3b1688SDavid Daney sd t2, OCTEON_CP2_AES_IV(a0) 1915b3b1688SDavid Daney dmfc2 t2, 0x0106 1925b3b1688SDavid Daney sd t3, OCTEON_CP2_AES_IV+8(a0) 1935b3b1688SDavid Daney dmfc2 t3, 0x0107 1945b3b1688SDavid Daney sd t0, OCTEON_CP2_AES_KEY(a0) 1955b3b1688SDavid Daney dmfc2 t0, 0x0110 1965b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_KEY+8(a0) 1975b3b1688SDavid Daney dmfc2 t1, 0x0100 1985b3b1688SDavid Daney sd t2, OCTEON_CP2_AES_KEY+16(a0) 1995b3b1688SDavid Daney dmfc2 t2, 0x0101 2005b3b1688SDavid Daney sd t3, OCTEON_CP2_AES_KEY+24(a0) 2015b3b1688SDavid Daney mfc0 t3, $15,0 /* Get the processor ID register */ 2025b3b1688SDavid Daney sd t0, OCTEON_CP2_AES_KEYLEN(a0) 2035b3b1688SDavid Daney li t0, 0x000d0000 /* This is the processor ID of Octeon Pass1 */ 2045b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_RESULT(a0) 2055b3b1688SDavid Daney sd t2, OCTEON_CP2_AES_RESULT+8(a0) 2065b3b1688SDavid Daney /* Skip to the Pass1 version of the remainder of the COP2 state */ 2075b3b1688SDavid Daney beq t3, t0, 2f 2085b3b1688SDavid Daney 2095b3b1688SDavid Daney /* the non-pass1 state when !CvmCtl[NOCRYPTO] */ 2105b3b1688SDavid Daney dmfc2 t1, 0x0240 2115b3b1688SDavid Daney dmfc2 t2, 0x0241 2125b3b1688SDavid Daney dmfc2 t3, 0x0242 2135b3b1688SDavid Daney dmfc2 t0, 0x0243 2145b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW(a0) 2155b3b1688SDavid Daney dmfc2 t1, 0x0244 2165b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+8(a0) 2175b3b1688SDavid Daney dmfc2 t2, 0x0245 2185b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+16(a0) 2195b3b1688SDavid Daney dmfc2 t3, 0x0246 2205b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+24(a0) 2215b3b1688SDavid Daney dmfc2 t0, 0x0247 2225b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+32(a0) 2235b3b1688SDavid Daney dmfc2 t1, 0x0248 2245b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+40(a0) 2255b3b1688SDavid Daney dmfc2 t2, 0x0249 2265b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+48(a0) 2275b3b1688SDavid Daney dmfc2 t3, 0x024A 2285b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+56(a0) 2295b3b1688SDavid Daney dmfc2 t0, 0x024B 2305b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+64(a0) 2315b3b1688SDavid Daney dmfc2 t1, 0x024C 2325b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+72(a0) 2335b3b1688SDavid Daney dmfc2 t2, 0x024D 2345b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+80(a0) 2355b3b1688SDavid Daney dmfc2 t3, 0x024E 2365b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+88(a0) 2375b3b1688SDavid Daney dmfc2 t0, 0x0250 2385b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+96(a0) 2395b3b1688SDavid Daney dmfc2 t1, 0x0251 2405b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+104(a0) 2415b3b1688SDavid Daney dmfc2 t2, 0x0252 2425b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+112(a0) 2435b3b1688SDavid Daney dmfc2 t3, 0x0253 2445b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW(a0) 2455b3b1688SDavid Daney dmfc2 t0, 0x0254 2465b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_IVW+8(a0) 2475b3b1688SDavid Daney dmfc2 t1, 0x0255 2485b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW+16(a0) 2495b3b1688SDavid Daney dmfc2 t2, 0x0256 2505b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+24(a0) 2515b3b1688SDavid Daney dmfc2 t3, 0x0257 2525b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW+32(a0) 2535b3b1688SDavid Daney dmfc2 t0, 0x0258 2545b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_IVW+40(a0) 2555b3b1688SDavid Daney dmfc2 t1, 0x0259 2565b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW+48(a0) 2575b3b1688SDavid Daney dmfc2 t2, 0x025E 2585b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+56(a0) 2595b3b1688SDavid Daney dmfc2 t3, 0x025A 2605b3b1688SDavid Daney sd t0, OCTEON_CP2_GFM_MULT(a0) 2615b3b1688SDavid Daney dmfc2 t0, 0x025B 2625b3b1688SDavid Daney sd t1, OCTEON_CP2_GFM_MULT+8(a0) 2635b3b1688SDavid Daney sd t2, OCTEON_CP2_GFM_POLY(a0) 2645b3b1688SDavid Daney sd t3, OCTEON_CP2_GFM_RESULT(a0) 2655b3b1688SDavid Daney sd t0, OCTEON_CP2_GFM_RESULT+8(a0) 2665b3b1688SDavid Daney jr ra 2675b3b1688SDavid Daney 2685b3b1688SDavid Daney2: /* pass 1 special stuff when !CvmCtl[NOCRYPTO] */ 2695b3b1688SDavid Daney dmfc2 t3, 0x0040 2705b3b1688SDavid Daney dmfc2 t0, 0x0041 2715b3b1688SDavid Daney dmfc2 t1, 0x0042 2725b3b1688SDavid Daney dmfc2 t2, 0x0043 2735b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW(a0) 2745b3b1688SDavid Daney dmfc2 t3, 0x0044 2755b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+8(a0) 2765b3b1688SDavid Daney dmfc2 t0, 0x0045 2775b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+16(a0) 2785b3b1688SDavid Daney dmfc2 t1, 0x0046 2795b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+24(a0) 2805b3b1688SDavid Daney dmfc2 t2, 0x0048 2815b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+32(a0) 2825b3b1688SDavid Daney dmfc2 t3, 0x0049 2835b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+40(a0) 2845b3b1688SDavid Daney dmfc2 t0, 0x004A 2855b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+48(a0) 2865b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW(a0) 2875b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+8(a0) 2885b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW+16(a0) 2895b3b1688SDavid Daney 2905b3b1688SDavid Daney3: /* pass 1 or CvmCtl[NOCRYPTO] set */ 2915b3b1688SDavid Daney jr ra 2925b3b1688SDavid Daney END(octeon_cop2_save) 2935b3b1688SDavid Daney 2945b3b1688SDavid Daney/* 2955b3b1688SDavid Daney * void octeon_cop2_restore(struct octeon_cop2_state *a0) 2965b3b1688SDavid Daney */ 2975b3b1688SDavid Daney .align 7 2985b3b1688SDavid Daney .set push 2995b3b1688SDavid Daney .set noreorder 3005b3b1688SDavid Daney LEAF(octeon_cop2_restore) 3015b3b1688SDavid Daney /* First cache line was prefetched before the call */ 3025b3b1688SDavid Daney pref 4, 128(a0) 3035b3b1688SDavid Daney dmfc0 t9, $9,7 /* CvmCtl register. */ 3045b3b1688SDavid Daney 3055b3b1688SDavid Daney pref 4, 256(a0) 3065b3b1688SDavid Daney ld t0, OCTEON_CP2_CRC_IV(a0) 3075b3b1688SDavid Daney pref 4, 384(a0) 3085b3b1688SDavid Daney ld t1, OCTEON_CP2_CRC_LENGTH(a0) 3095b3b1688SDavid Daney ld t2, OCTEON_CP2_CRC_POLY(a0) 3105b3b1688SDavid Daney 3115b3b1688SDavid Daney /* Restore the COP2 CRC state */ 3125b3b1688SDavid Daney dmtc2 t0, 0x0201 3135b3b1688SDavid Daney dmtc2 t1, 0x1202 3145b3b1688SDavid Daney bbit1 t9, 28, 2f /* Skip LLM if CvmCtl[NODFA_CP2] is set */ 3155b3b1688SDavid Daney dmtc2 t2, 0x4200 3165b3b1688SDavid Daney 3175b3b1688SDavid Daney /* Restore the LLM state */ 3185b3b1688SDavid Daney ld t0, OCTEON_CP2_LLM_DAT(a0) 3195b3b1688SDavid Daney ld t1, OCTEON_CP2_LLM_DAT+8(a0) 3205b3b1688SDavid Daney dmtc2 t0, 0x0402 3215b3b1688SDavid Daney dmtc2 t1, 0x040A 3225b3b1688SDavid Daney 3235b3b1688SDavid Daney2: 3245b3b1688SDavid Daney bbit1 t9, 26, done_restore /* done if CvmCtl[NOCRYPTO] set */ 3255b3b1688SDavid Daney nop 3265b3b1688SDavid Daney 3275b3b1688SDavid Daney /* Restore the COP2 crypto state common to pass 1 and pass 2 */ 3285b3b1688SDavid Daney ld t0, OCTEON_CP2_3DES_IV(a0) 3295b3b1688SDavid Daney ld t1, OCTEON_CP2_3DES_KEY(a0) 3305b3b1688SDavid Daney ld t2, OCTEON_CP2_3DES_KEY+8(a0) 3315b3b1688SDavid Daney dmtc2 t0, 0x0084 3325b3b1688SDavid Daney ld t0, OCTEON_CP2_3DES_KEY+16(a0) 3335b3b1688SDavid Daney dmtc2 t1, 0x0080 3345b3b1688SDavid Daney ld t1, OCTEON_CP2_3DES_RESULT(a0) 3355b3b1688SDavid Daney dmtc2 t2, 0x0081 3365b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_INP0(a0) /* only really needed for pass 1 */ 3375b3b1688SDavid Daney dmtc2 t0, 0x0082 3385b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_IV(a0) 3395b3b1688SDavid Daney dmtc2 t1, 0x0098 3405b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_IV+8(a0) 3415b3b1688SDavid Daney dmtc2 t2, 0x010A /* only really needed for pass 1 */ 3425b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_KEY(a0) 3435b3b1688SDavid Daney dmtc2 t0, 0x0102 3445b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_KEY+8(a0) 3455b3b1688SDavid Daney dmtc2 t1, 0x0103 3465b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_KEY+16(a0) 3475b3b1688SDavid Daney dmtc2 t2, 0x0104 3485b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_KEY+24(a0) 3495b3b1688SDavid Daney dmtc2 t0, 0x0105 3505b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_KEYLEN(a0) 3515b3b1688SDavid Daney dmtc2 t1, 0x0106 3525b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_RESULT(a0) 3535b3b1688SDavid Daney dmtc2 t2, 0x0107 3545b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_RESULT+8(a0) 3555b3b1688SDavid Daney mfc0 t3, $15,0 /* Get the processor ID register */ 3565b3b1688SDavid Daney dmtc2 t0, 0x0110 3575b3b1688SDavid Daney li t0, 0x000d0000 /* This is the processor ID of Octeon Pass1 */ 3585b3b1688SDavid Daney dmtc2 t1, 0x0100 3595b3b1688SDavid Daney bne t0, t3, 3f /* Skip the next stuff for non-pass1 */ 3605b3b1688SDavid Daney dmtc2 t2, 0x0101 3615b3b1688SDavid Daney 3625b3b1688SDavid Daney /* this code is specific for pass 1 */ 3635b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW(a0) 3645b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+8(a0) 3655b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+16(a0) 3665b3b1688SDavid Daney dmtc2 t0, 0x0040 3675b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+24(a0) 3685b3b1688SDavid Daney dmtc2 t1, 0x0041 3695b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+32(a0) 3705b3b1688SDavid Daney dmtc2 t2, 0x0042 3715b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+40(a0) 3725b3b1688SDavid Daney dmtc2 t0, 0x0043 3735b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+48(a0) 3745b3b1688SDavid Daney dmtc2 t1, 0x0044 3755b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW(a0) 3765b3b1688SDavid Daney dmtc2 t2, 0x0045 3775b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+8(a0) 3785b3b1688SDavid Daney dmtc2 t0, 0x0046 3795b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+16(a0) 3805b3b1688SDavid Daney dmtc2 t1, 0x0048 3815b3b1688SDavid Daney dmtc2 t2, 0x0049 3825b3b1688SDavid Daney b done_restore /* unconditional branch */ 3835b3b1688SDavid Daney dmtc2 t0, 0x004A 3845b3b1688SDavid Daney 3855b3b1688SDavid Daney3: /* this is post-pass1 code */ 3865b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW(a0) 3875b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+8(a0) 3885b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+16(a0) 3895b3b1688SDavid Daney dmtc2 t2, 0x0240 3905b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+24(a0) 3915b3b1688SDavid Daney dmtc2 t0, 0x0241 3925b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+32(a0) 3935b3b1688SDavid Daney dmtc2 t1, 0x0242 3945b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+40(a0) 3955b3b1688SDavid Daney dmtc2 t2, 0x0243 3965b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+48(a0) 3975b3b1688SDavid Daney dmtc2 t0, 0x0244 3985b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+56(a0) 3995b3b1688SDavid Daney dmtc2 t1, 0x0245 4005b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+64(a0) 4015b3b1688SDavid Daney dmtc2 t2, 0x0246 4025b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+72(a0) 4035b3b1688SDavid Daney dmtc2 t0, 0x0247 4045b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+80(a0) 4055b3b1688SDavid Daney dmtc2 t1, 0x0248 4065b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+88(a0) 4075b3b1688SDavid Daney dmtc2 t2, 0x0249 4085b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+96(a0) 4095b3b1688SDavid Daney dmtc2 t0, 0x024A 4105b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+104(a0) 4115b3b1688SDavid Daney dmtc2 t1, 0x024B 4125b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+112(a0) 4135b3b1688SDavid Daney dmtc2 t2, 0x024C 4145b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW(a0) 4155b3b1688SDavid Daney dmtc2 t0, 0x024D 4165b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+8(a0) 4175b3b1688SDavid Daney dmtc2 t1, 0x024E 4185b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW+16(a0) 4195b3b1688SDavid Daney dmtc2 t2, 0x0250 4205b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+24(a0) 4215b3b1688SDavid Daney dmtc2 t0, 0x0251 4225b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+32(a0) 4235b3b1688SDavid Daney dmtc2 t1, 0x0252 4245b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW+40(a0) 4255b3b1688SDavid Daney dmtc2 t2, 0x0253 4265b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+48(a0) 4275b3b1688SDavid Daney dmtc2 t0, 0x0254 4285b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+56(a0) 4295b3b1688SDavid Daney dmtc2 t1, 0x0255 4305b3b1688SDavid Daney ld t1, OCTEON_CP2_GFM_MULT(a0) 4315b3b1688SDavid Daney dmtc2 t2, 0x0256 4325b3b1688SDavid Daney ld t2, OCTEON_CP2_GFM_MULT+8(a0) 4335b3b1688SDavid Daney dmtc2 t0, 0x0257 4345b3b1688SDavid Daney ld t0, OCTEON_CP2_GFM_POLY(a0) 4355b3b1688SDavid Daney dmtc2 t1, 0x0258 4365b3b1688SDavid Daney ld t1, OCTEON_CP2_GFM_RESULT(a0) 4375b3b1688SDavid Daney dmtc2 t2, 0x0259 4385b3b1688SDavid Daney ld t2, OCTEON_CP2_GFM_RESULT+8(a0) 4395b3b1688SDavid Daney dmtc2 t0, 0x025E 4405b3b1688SDavid Daney dmtc2 t1, 0x025A 4415b3b1688SDavid Daney dmtc2 t2, 0x025B 4425b3b1688SDavid Daney 4435b3b1688SDavid Daneydone_restore: 4445b3b1688SDavid Daney jr ra 4455b3b1688SDavid Daney nop 4465b3b1688SDavid Daney END(octeon_cop2_restore) 4475b3b1688SDavid Daney .set pop 4485b3b1688SDavid Daney 4495b3b1688SDavid Daney/* 4505b3b1688SDavid Daney * void octeon_mult_save() 4515b3b1688SDavid Daney * sp is assumed to point to a struct pt_regs 4525b3b1688SDavid Daney * 4535b3b1688SDavid Daney * NOTE: This is called in SAVE_SOME in stackframe.h. It can only 4545b3b1688SDavid Daney * safely modify k0 and k1. 4555b3b1688SDavid Daney */ 4565b3b1688SDavid Daney .align 7 4575b3b1688SDavid Daney .set push 4585b3b1688SDavid Daney .set noreorder 4595b3b1688SDavid Daney LEAF(octeon_mult_save) 4605b3b1688SDavid Daney dmfc0 k0, $9,7 /* CvmCtl register. */ 4615b3b1688SDavid Daney bbit1 k0, 27, 1f /* Skip CvmCtl[NOMUL] */ 4625b3b1688SDavid Daney nop 4635b3b1688SDavid Daney 4645b3b1688SDavid Daney /* Save the multiplier state */ 4655b3b1688SDavid Daney v3mulu k0, $0, $0 4665b3b1688SDavid Daney v3mulu k1, $0, $0 4675b3b1688SDavid Daney sd k0, PT_MTP(sp) /* PT_MTP has P0 */ 4685b3b1688SDavid Daney v3mulu k0, $0, $0 4695b3b1688SDavid Daney sd k1, PT_MTP+8(sp) /* PT_MTP+8 has P1 */ 4705b3b1688SDavid Daney ori k1, $0, 1 4715b3b1688SDavid Daney v3mulu k1, k1, $0 4725b3b1688SDavid Daney sd k0, PT_MTP+16(sp) /* PT_MTP+16 has P2 */ 4735b3b1688SDavid Daney v3mulu k0, $0, $0 4745b3b1688SDavid Daney sd k1, PT_MPL(sp) /* PT_MPL has MPL0 */ 4755b3b1688SDavid Daney v3mulu k1, $0, $0 4765b3b1688SDavid Daney sd k0, PT_MPL+8(sp) /* PT_MPL+8 has MPL1 */ 4775b3b1688SDavid Daney jr ra 4785b3b1688SDavid Daney sd k1, PT_MPL+16(sp) /* PT_MPL+16 has MPL2 */ 4795b3b1688SDavid Daney 4805b3b1688SDavid Daney1: /* Resume here if CvmCtl[NOMUL] */ 4815b3b1688SDavid Daney jr ra 4825b3b1688SDavid Daney END(octeon_mult_save) 4835b3b1688SDavid Daney .set pop 4845b3b1688SDavid Daney 4855b3b1688SDavid Daney/* 4865b3b1688SDavid Daney * void octeon_mult_restore() 4875b3b1688SDavid Daney * sp is assumed to point to a struct pt_regs 4885b3b1688SDavid Daney * 4895b3b1688SDavid Daney * NOTE: This is called in RESTORE_SOME in stackframe.h. 4905b3b1688SDavid Daney */ 4915b3b1688SDavid Daney .align 7 4925b3b1688SDavid Daney .set push 4935b3b1688SDavid Daney .set noreorder 4945b3b1688SDavid Daney LEAF(octeon_mult_restore) 4955b3b1688SDavid Daney dmfc0 k1, $9,7 /* CvmCtl register. */ 4965b3b1688SDavid Daney ld v0, PT_MPL(sp) /* MPL0 */ 4975b3b1688SDavid Daney ld v1, PT_MPL+8(sp) /* MPL1 */ 4985b3b1688SDavid Daney ld k0, PT_MPL+16(sp) /* MPL2 */ 4995b3b1688SDavid Daney bbit1 k1, 27, 1f /* Skip CvmCtl[NOMUL] */ 5005b3b1688SDavid Daney /* Normally falls through, so no time wasted here */ 5015b3b1688SDavid Daney nop 5025b3b1688SDavid Daney 5035b3b1688SDavid Daney /* Restore the multiplier state */ 5045b3b1688SDavid Daney ld k1, PT_MTP+16(sp) /* P2 */ 5055b3b1688SDavid Daney MTM0 v0 /* MPL0 */ 5065b3b1688SDavid Daney ld v0, PT_MTP+8(sp) /* P1 */ 5075b3b1688SDavid Daney MTM1 v1 /* MPL1 */ 5085b3b1688SDavid Daney ld v1, PT_MTP(sp) /* P0 */ 5095b3b1688SDavid Daney MTM2 k0 /* MPL2 */ 5105b3b1688SDavid Daney MTP2 k1 /* P2 */ 5115b3b1688SDavid Daney MTP1 v0 /* P1 */ 5125b3b1688SDavid Daney jr ra 5135b3b1688SDavid Daney MTP0 v1 /* P0 */ 5145b3b1688SDavid Daney 5155b3b1688SDavid Daney1: /* Resume here if CvmCtl[NOMUL] */ 5165b3b1688SDavid Daney jr ra 5175b3b1688SDavid Daney nop 5185b3b1688SDavid Daney END(octeon_mult_restore) 5195b3b1688SDavid Daney .set pop 520