cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fpu_traps.S (8358B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2	/* This is trivial with the new code... */
      3	.globl		do_fpdis
      4	.type		do_fpdis,#function
      5do_fpdis:
      6	sethi		%hi(TSTATE_PEF), %g4
      7	rdpr		%tstate, %g5
      8	andcc		%g5, %g4, %g0
      9	be,pt		%xcc, 1f
     10	 nop
     11	rd		%fprs, %g5
     12	andcc		%g5, FPRS_FEF, %g0
     13	be,pt		%xcc, 1f
     14	 nop
     15
     16	/* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
     17	sethi		%hi(109f), %g7
     18	ba,pt		%xcc, etrap
     19109:	 or		%g7, %lo(109b), %g7
     20	add		%g0, %g0, %g0
     21	ba,a,pt		%xcc, rtrap
     22
     231:	TRAP_LOAD_THREAD_REG(%g6, %g1)
     24	ldub		[%g6 + TI_FPSAVED], %g5
     25	wr		%g0, FPRS_FEF, %fprs
     26	andcc		%g5, FPRS_FEF, %g0
     27	be,a,pt		%icc, 1f
     28	 clr		%g7
     29	ldx		[%g6 + TI_GSR], %g7
     301:	andcc		%g5, FPRS_DL, %g0
     31	bne,pn		%icc, 2f
     32	 fzero		%f0
     33	andcc		%g5, FPRS_DU, %g0
     34	bne,pn		%icc, 1f
     35	 fzero		%f2
     36	faddd		%f0, %f2, %f4
     37	fmuld		%f0, %f2, %f6
     38	faddd		%f0, %f2, %f8
     39	fmuld		%f0, %f2, %f10
     40	faddd		%f0, %f2, %f12
     41	fmuld		%f0, %f2, %f14
     42	faddd		%f0, %f2, %f16
     43	fmuld		%f0, %f2, %f18
     44	faddd		%f0, %f2, %f20
     45	fmuld		%f0, %f2, %f22
     46	faddd		%f0, %f2, %f24
     47	fmuld		%f0, %f2, %f26
     48	faddd		%f0, %f2, %f28
     49	fmuld		%f0, %f2, %f30
     50	faddd		%f0, %f2, %f32
     51	fmuld		%f0, %f2, %f34
     52	faddd		%f0, %f2, %f36
     53	fmuld		%f0, %f2, %f38
     54	faddd		%f0, %f2, %f40
     55	fmuld		%f0, %f2, %f42
     56	faddd		%f0, %f2, %f44
     57	fmuld		%f0, %f2, %f46
     58	faddd		%f0, %f2, %f48
     59	fmuld		%f0, %f2, %f50
     60	faddd		%f0, %f2, %f52
     61	fmuld		%f0, %f2, %f54
     62	faddd		%f0, %f2, %f56
     63	fmuld		%f0, %f2, %f58
     64	b,pt		%xcc, fpdis_exit2
     65	 faddd		%f0, %f2, %f60
     661:	mov		SECONDARY_CONTEXT, %g3
     67	add		%g6, TI_FPREGS + 0x80, %g1
     68	faddd		%f0, %f2, %f4
     69	fmuld		%f0, %f2, %f6
     70
     71661:	ldxa		[%g3] ASI_DMMU, %g5
     72	.section	.sun4v_1insn_patch, "ax"
     73	.word		661b
     74	ldxa		[%g3] ASI_MMU, %g5
     75	.previous
     76
     77	sethi		%hi(sparc64_kern_sec_context), %g2
     78	ldx		[%g2 + %lo(sparc64_kern_sec_context)], %g2
     79
     80661:	stxa		%g2, [%g3] ASI_DMMU
     81	.section	.sun4v_1insn_patch, "ax"
     82	.word		661b
     83	stxa		%g2, [%g3] ASI_MMU
     84	.previous
     85
     86	membar		#Sync
     87	add		%g6, TI_FPREGS + 0xc0, %g2
     88	faddd		%f0, %f2, %f8
     89	fmuld		%f0, %f2, %f10
     90	membar		#Sync
     91	ldda		[%g1] ASI_BLK_S, %f32
     92	ldda		[%g2] ASI_BLK_S, %f48
     93	membar		#Sync
     94	faddd		%f0, %f2, %f12
     95	fmuld		%f0, %f2, %f14
     96	faddd		%f0, %f2, %f16
     97	fmuld		%f0, %f2, %f18
     98	faddd		%f0, %f2, %f20
     99	fmuld		%f0, %f2, %f22
    100	faddd		%f0, %f2, %f24
    101	fmuld		%f0, %f2, %f26
    102	faddd		%f0, %f2, %f28
    103	fmuld		%f0, %f2, %f30
    104	ba,a,pt		%xcc, fpdis_exit
    105
    1062:	andcc		%g5, FPRS_DU, %g0
    107	bne,pt		%icc, 3f
    108	 fzero		%f32
    109	mov		SECONDARY_CONTEXT, %g3
    110	fzero		%f34
    111
    112661:	ldxa		[%g3] ASI_DMMU, %g5
    113	.section	.sun4v_1insn_patch, "ax"
    114	.word		661b
    115	ldxa		[%g3] ASI_MMU, %g5
    116	.previous
    117
    118	add		%g6, TI_FPREGS, %g1
    119	sethi		%hi(sparc64_kern_sec_context), %g2
    120	ldx		[%g2 + %lo(sparc64_kern_sec_context)], %g2
    121
    122661:	stxa		%g2, [%g3] ASI_DMMU
    123	.section	.sun4v_1insn_patch, "ax"
    124	.word		661b
    125	stxa		%g2, [%g3] ASI_MMU
    126	.previous
    127
    128	membar		#Sync
    129	add		%g6, TI_FPREGS + 0x40, %g2
    130	faddd		%f32, %f34, %f36
    131	fmuld		%f32, %f34, %f38
    132	membar		#Sync
    133	ldda		[%g1] ASI_BLK_S, %f0
    134	ldda		[%g2] ASI_BLK_S, %f16
    135	membar		#Sync
    136	faddd		%f32, %f34, %f40
    137	fmuld		%f32, %f34, %f42
    138	faddd		%f32, %f34, %f44
    139	fmuld		%f32, %f34, %f46
    140	faddd		%f32, %f34, %f48
    141	fmuld		%f32, %f34, %f50
    142	faddd		%f32, %f34, %f52
    143	fmuld		%f32, %f34, %f54
    144	faddd		%f32, %f34, %f56
    145	fmuld		%f32, %f34, %f58
    146	faddd		%f32, %f34, %f60
    147	fmuld		%f32, %f34, %f62
    148	ba,a,pt		%xcc, fpdis_exit
    149
    1503:	mov		SECONDARY_CONTEXT, %g3
    151	add		%g6, TI_FPREGS, %g1
    152
    153661:	ldxa		[%g3] ASI_DMMU, %g5
    154	.section	.sun4v_1insn_patch, "ax"
    155	.word		661b
    156	ldxa		[%g3] ASI_MMU, %g5
    157	.previous
    158
    159	sethi		%hi(sparc64_kern_sec_context), %g2
    160	ldx		[%g2 + %lo(sparc64_kern_sec_context)], %g2
    161
    162661:	stxa		%g2, [%g3] ASI_DMMU
    163	.section	.sun4v_1insn_patch, "ax"
    164	.word		661b
    165	stxa		%g2, [%g3] ASI_MMU
    166	.previous
    167
    168	membar		#Sync
    169	mov		0x40, %g2
    170	membar		#Sync
    171	ldda		[%g1] ASI_BLK_S, %f0
    172	ldda		[%g1 + %g2] ASI_BLK_S, %f16
    173	add		%g1, 0x80, %g1
    174	ldda		[%g1] ASI_BLK_S, %f32
    175	ldda		[%g1 + %g2] ASI_BLK_S, %f48
    176	membar		#Sync
    177fpdis_exit:
    178
    179661:	stxa		%g5, [%g3] ASI_DMMU
    180	.section	.sun4v_1insn_patch, "ax"
    181	.word		661b
    182	stxa		%g5, [%g3] ASI_MMU
    183	.previous
    184
    185	membar		#Sync
    186fpdis_exit2:
    187	wr		%g7, 0, %gsr
    188	ldx		[%g6 + TI_XFSR], %fsr
    189	rdpr		%tstate, %g3
    190	or		%g3, %g4, %g3		! anal...
    191	wrpr		%g3, %tstate
    192	wr		%g0, FPRS_FEF, %fprs	! clean DU/DL bits
    193	retry
    194	.size		do_fpdis,.-do_fpdis
    195
    196	.align		32
    197	.type		fp_other_bounce,#function
    198fp_other_bounce:
    199	call		do_fpother
    200	 add		%sp, PTREGS_OFF, %o0
    201	ba,a,pt		%xcc, rtrap
    202	.size		fp_other_bounce,.-fp_other_bounce
    203
    204	.align		32
    205	.globl		do_fpother_check_fitos
    206	.type		do_fpother_check_fitos,#function
    207do_fpother_check_fitos:
    208	TRAP_LOAD_THREAD_REG(%g6, %g1)
    209	sethi		%hi(fp_other_bounce - 4), %g7
    210	or		%g7, %lo(fp_other_bounce - 4), %g7
    211
    212	/* NOTE: Need to preserve %g7 until we fully commit
    213	 *       to the fitos fixup.
    214	 */
    215	stx		%fsr, [%g6 + TI_XFSR]
    216	rdpr		%tstate, %g3
    217	andcc		%g3, TSTATE_PRIV, %g0
    218	bne,pn		%xcc, do_fptrap_after_fsr
    219	 nop
    220	ldx		[%g6 + TI_XFSR], %g3
    221	srlx		%g3, 14, %g1
    222	and		%g1, 7, %g1
    223	cmp		%g1, 2			! Unfinished FP-OP
    224	bne,pn		%xcc, do_fptrap_after_fsr
    225	 sethi		%hi(1 << 23), %g1	! Inexact
    226	andcc		%g3, %g1, %g0
    227	bne,pn		%xcc, do_fptrap_after_fsr
    228	 rdpr		%tpc, %g1
    229	lduwa		[%g1] ASI_AIUP, %g3	! This cannot ever fail
    230#define FITOS_MASK	0xc1f83fe0
    231#define FITOS_COMPARE	0x81a01880
    232	sethi		%hi(FITOS_MASK), %g1
    233	or		%g1, %lo(FITOS_MASK), %g1
    234	and		%g3, %g1, %g1
    235	sethi		%hi(FITOS_COMPARE), %g2
    236	or		%g2, %lo(FITOS_COMPARE), %g2
    237	cmp		%g1, %g2
    238	bne,pn		%xcc, do_fptrap_after_fsr
    239	 nop
    240	std		%f62, [%g6 + TI_FPREGS + (62 * 4)]
    241	sethi		%hi(fitos_table_1), %g1
    242	and		%g3, 0x1f, %g2
    243	or		%g1, %lo(fitos_table_1),  %g1
    244	sllx		%g2, 2, %g2
    245	jmpl		%g1 + %g2, %g0
    246	 ba,pt		%xcc, fitos_emul_continue
    247
    248fitos_table_1:
    249	fitod		%f0, %f62
    250	fitod		%f1, %f62
    251	fitod		%f2, %f62
    252	fitod		%f3, %f62
    253	fitod		%f4, %f62
    254	fitod		%f5, %f62
    255	fitod		%f6, %f62
    256	fitod		%f7, %f62
    257	fitod		%f8, %f62
    258	fitod		%f9, %f62
    259	fitod		%f10, %f62
    260	fitod		%f11, %f62
    261	fitod		%f12, %f62
    262	fitod		%f13, %f62
    263	fitod		%f14, %f62
    264	fitod		%f15, %f62
    265	fitod		%f16, %f62
    266	fitod		%f17, %f62
    267	fitod		%f18, %f62
    268	fitod		%f19, %f62
    269	fitod		%f20, %f62
    270	fitod		%f21, %f62
    271	fitod		%f22, %f62
    272	fitod		%f23, %f62
    273	fitod		%f24, %f62
    274	fitod		%f25, %f62
    275	fitod		%f26, %f62
    276	fitod		%f27, %f62
    277	fitod		%f28, %f62
    278	fitod		%f29, %f62
    279	fitod		%f30, %f62
    280	fitod		%f31, %f62
    281
    282fitos_emul_continue:
    283	sethi		%hi(fitos_table_2), %g1
    284	srl		%g3, 25, %g2
    285	or		%g1, %lo(fitos_table_2), %g1
    286	and		%g2, 0x1f, %g2
    287	sllx		%g2, 2, %g2
    288	jmpl		%g1 + %g2, %g0
    289	 ba,pt		%xcc, fitos_emul_fini
    290
    291fitos_table_2:
    292	fdtos		%f62, %f0
    293	fdtos		%f62, %f1
    294	fdtos		%f62, %f2
    295	fdtos		%f62, %f3
    296	fdtos		%f62, %f4
    297	fdtos		%f62, %f5
    298	fdtos		%f62, %f6
    299	fdtos		%f62, %f7
    300	fdtos		%f62, %f8
    301	fdtos		%f62, %f9
    302	fdtos		%f62, %f10
    303	fdtos		%f62, %f11
    304	fdtos		%f62, %f12
    305	fdtos		%f62, %f13
    306	fdtos		%f62, %f14
    307	fdtos		%f62, %f15
    308	fdtos		%f62, %f16
    309	fdtos		%f62, %f17
    310	fdtos		%f62, %f18
    311	fdtos		%f62, %f19
    312	fdtos		%f62, %f20
    313	fdtos		%f62, %f21
    314	fdtos		%f62, %f22
    315	fdtos		%f62, %f23
    316	fdtos		%f62, %f24
    317	fdtos		%f62, %f25
    318	fdtos		%f62, %f26
    319	fdtos		%f62, %f27
    320	fdtos		%f62, %f28
    321	fdtos		%f62, %f29
    322	fdtos		%f62, %f30
    323	fdtos		%f62, %f31
    324
    325fitos_emul_fini:
    326	ldd		[%g6 + TI_FPREGS + (62 * 4)], %f62
    327	done
    328	.size		do_fpother_check_fitos,.-do_fpother_check_fitos
    329
    330	.align		32
    331	.globl		do_fptrap
    332	.type		do_fptrap,#function
    333do_fptrap:
    334	TRAP_LOAD_THREAD_REG(%g6, %g1)
    335	stx		%fsr, [%g6 + TI_XFSR]
    336do_fptrap_after_fsr:
    337	ldub		[%g6 + TI_FPSAVED], %g3
    338	rd		%fprs, %g1
    339	or		%g3, %g1, %g3
    340	stb		%g3, [%g6 + TI_FPSAVED]
    341	rd		%gsr, %g3
    342	stx		%g3, [%g6 + TI_GSR]
    343	mov		SECONDARY_CONTEXT, %g3
    344
    345661:	ldxa		[%g3] ASI_DMMU, %g5
    346	.section	.sun4v_1insn_patch, "ax"
    347	.word		661b
    348	ldxa		[%g3] ASI_MMU, %g5
    349	.previous
    350
    351	sethi		%hi(sparc64_kern_sec_context), %g2
    352	ldx		[%g2 + %lo(sparc64_kern_sec_context)], %g2
    353
    354661:	stxa		%g2, [%g3] ASI_DMMU
    355	.section	.sun4v_1insn_patch, "ax"
    356	.word		661b
    357	stxa		%g2, [%g3] ASI_MMU
    358	.previous
    359
    360	membar		#Sync
    361	add		%g6, TI_FPREGS, %g2
    362	andcc		%g1, FPRS_DL, %g0
    363	be,pn		%icc, 4f
    364	 mov		0x40, %g3
    365	stda		%f0, [%g2] ASI_BLK_S
    366	stda		%f16, [%g2 + %g3] ASI_BLK_S
    367	andcc		%g1, FPRS_DU, %g0
    368	be,pn		%icc, 5f
    3694:       add		%g2, 128, %g2
    370	stda		%f32, [%g2] ASI_BLK_S
    371	stda		%f48, [%g2 + %g3] ASI_BLK_S
    3725:	mov		SECONDARY_CONTEXT, %g1
    373	membar		#Sync
    374
    375661:	stxa		%g5, [%g1] ASI_DMMU
    376	.section	.sun4v_1insn_patch, "ax"
    377	.word		661b
    378	stxa		%g5, [%g1] ASI_MMU
    379	.previous
    380
    381	membar		#Sync
    382	ba,pt		%xcc, etrap
    383	 wr		%g0, 0, %fprs
    384	.size		do_fptrap,.-do_fptrap