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

toc_asm.S (1442B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2
      3/* TOC (Transfer of Control) handler. */
      4
      5	.level 1.1
      6
      7#include <asm/assembly.h>
      8#include <linux/threads.h>
      9#include <linux/linkage.h>
     10
     11	.text
     12	.import toc_intr,code
     13	.import toc_stack,data
     14	.align 16
     15ENTRY_CFI(toc_handler)
     16	load32	PA(toc_stack),%sp
     17
     18#ifdef CONFIG_SMP
     19	/* get per-cpu toc_stack address. */
     20	mfctl   %cr30, %r1
     21	tophys  %r1,%r2			/* task_struct */
     22	LDREG   TASK_TI_CPU(%r2),%r4	/* cpu */
     23	load32	PA(__per_cpu_offset),%r1
     24	LDREGX  %r4(%r1),%r4
     25	add	%r4,%sp,%sp
     26#endif
     27
     28	/*
     29	 * setup pt_regs on stack and save the
     30	 * floating point registers. PIM_TOC doesn't
     31	 * save fp registers, so we're doing it here.
     32	 */
     33	copy	%sp,%arg0
     34	ldo	PT_SZ_ALGN(%sp), %sp
     35
     36	/* clear pt_regs */
     37	copy	%arg0,%r1
     380:	cmpb,<<,n %r1,%sp,0b
     39	stw,ma	%r0,4(%r1)
     40
     41	ldo	PT_FR0(%arg0),%r25
     42	save_fp	%r25
     43
     44	/* go virtual */
     45	load32	PA(swapper_pg_dir),%r4
     46	mtctl	%r4,%cr24
     47	mtctl	%r4,%cr25
     48
     49	/* Clear sr4-sr7 */
     50	mtsp	%r0, %sr4
     51	mtsp	%r0, %sr5
     52	mtsp	%r0, %sr6
     53	mtsp	%r0, %sr7
     54
     55	tovirt_r1 %sp
     56	tovirt_r1 %arg0
     57	virt_map
     58
     59	loadgp
     60
     61#ifdef CONFIG_64BIT
     62	ldo	-16(%sp),%r29
     63#endif
     64	load32	toc_intr,%r1
     65	be	0(%sr7,%r1)
     66	nop
     67ENDPROC_CFI(toc_handler)
     68
     69	/*
     70	 * keep this checksum here, as it is part of the toc_handler
     71	 * spanned by toc_handler_size (all words in toc_handler are
     72	 * added in PDC and the sum must equal to zero.
     73	 */
     74SYM_DATA(toc_handler_csum, .long 0)
     75SYM_DATA(toc_handler_size, .long . - toc_handler)