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

branch_loops.S (1067B)


      1// SPDX-License-Identifier: GPL-2.0+
      2
      3/*
      4 * Copyright 2019, Michael Ellerman, IBM Corp.
      5 */
      6
      7#include <ppc-asm.h>
      8
      9	.data
     10
     11jump_table:
     12	.long	0x0
     13	.long	(.Lstate_1 - .Lstate_0)
     14	.long	(.Lstate_2 - .Lstate_0)
     15	.long	(.Lstate_3 - .Lstate_0)
     16	.long	(.Lstate_4 - .Lstate_0)
     17	.long	(.Lstate_5 - .Lstate_0)
     18	.long	(.Lstate_6 - .Lstate_0)
     19	.long	(.Lstate_7 - .Lstate_0)
     20
     21	.text
     22
     23#define ITER_SHIFT	31
     24
     25.macro state number
     26	.balign	32
     27.Lstate_\number:
     28	.if	\number==7
     29	li	r3, 0
     30	.else
     31	li	r3, \number+1
     32	.endif
     33	b	.Lloop
     34.endm
     35
     36FUNC_START(pattern_cache_loop)
     37	li	r3, 0
     38	li	r4, 1
     39	sldi	r4, r4, ITER_SHIFT
     40
     41.Lloop:	cmpdi	r4, 0
     42	beqlr
     43
     44	addi	r4, r4, -1
     45
     46	ld	r6, jump_table@got(%r2)
     47	sldi	r5, r3, 2
     48	lwax	r6, r5, r6
     49	ld	r7, .Lstate_0@got(%r2)
     50	add	r6, r6, r7
     51	mtctr	r6
     52	bctr
     53
     54	state	0
     55	state	1
     56	state	2
     57	state	3
     58	state	4
     59	state	5
     60	state	6
     61	state	7
     62
     63FUNC_END(pattern_cache_loop)
     64
     65
     66FUNC_START(indirect_branch_loop)
     67	li	r3, 1
     68	sldi	r3, r3, ITER_SHIFT
     69
     701:	cmpdi	r3, 0
     71	beqlr
     72
     73	addi	r3, r3, -1
     74
     75	ld	r4, 2f@got(%r2)
     76	mtctr	r4
     77	bctr
     78
     79	.balign 32
     802:	b	1b
     81
     82FUNC_END(indirect_branch_loop)