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

ebb_handler.S (7495B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright 2014, Michael Ellerman, IBM Corp.
      4 */
      5
      6#include <ppc-asm.h>
      7#include "reg.h"
      8
      9
     10/* ppc-asm.h defines most of the reg aliases, but not r1/r2. */
     11#define r1 1
     12#define r2 2
     13
     14#define RFEBB   .long 0x4c000924
     15
     16/* Stack layout:
     17 *
     18 *                   ^
     19 *  User stack       |
     20 *  Back chain ------+	<- r1		<-------+
     21 *  ...						|
     22 *  Red zone / ABI Gap				|
     23 *  ...						|
     24 *  vr63	<+				|
     25 *  vr0		 |				|
     26 *  VSCR	 |				|
     27 *  FSCR	 |				|
     28 *  r31		 | Save area			|
     29 *  r0		 |				|
     30 *  XER		 |				|
     31 *  CTR		 |				|
     32 *  LR		 |				|
     33 *  CCR		<+				|
     34 *  ...		<+				|
     35 *  LR		 | Caller frame			|
     36 *  CCR		 |				|
     37 *  Back chain	<+	<- updated r1	--------+
     38 *
     39 */
     40
     41#if defined(_CALL_ELF) && _CALL_ELF == 2
     42#define ABIGAP		512
     43#else
     44#define ABIGAP		288
     45#endif
     46
     47#define NR_GPR		32
     48#define NR_SPR		6
     49#define NR_VSR		64
     50
     51#define SAVE_AREA	((NR_GPR + NR_SPR) * 8 + (NR_VSR * 16))
     52#define CALLER_FRAME	112
     53
     54#define STACK_FRAME	(ABIGAP + SAVE_AREA + CALLER_FRAME)
     55
     56#define CCR_SAVE	(CALLER_FRAME)
     57#define LR_SAVE		(CCR_SAVE + 8)
     58#define CTR_SAVE	(LR_SAVE  + 8)
     59#define XER_SAVE	(CTR_SAVE + 8)
     60#define GPR_SAVE(n)	(XER_SAVE + 8 + (8 * n))
     61#define FSCR_SAVE	(GPR_SAVE(31) + 8)
     62#define VSCR_SAVE	(FSCR_SAVE + 8)
     63#define VSR_SAVE(n)	(VSCR_SAVE + 8 + (16 * n))
     64
     65#define SAVE_GPR(n)	std n,GPR_SAVE(n)(r1)
     66#define REST_GPR(n)	ld  n,GPR_SAVE(n)(r1)
     67#define TRASH_GPR(n)	lis n,0xaaaa
     68
     69#define SAVE_VSR(n, b)	li b, VSR_SAVE(n); stxvd2x n,b,r1
     70#define LOAD_VSR(n, b)	li b, VSR_SAVE(n); lxvd2x  n,b,r1
     71
     72#define LOAD_REG_IMMEDIATE(reg,expr)	\
     73	lis     reg,(expr)@highest;	\
     74	ori     reg,reg,(expr)@higher;	\
     75	rldicr  reg,reg,32,31;		\
     76	oris    reg,reg,(expr)@h;	\
     77	ori     reg,reg,(expr)@l;
     78
     79
     80#if defined(_CALL_ELF) && _CALL_ELF == 2
     81#define ENTRY_POINT(name) \
     82	.type FUNC_NAME(name),@function; \
     83	.globl FUNC_NAME(name); \
     84	FUNC_NAME(name):
     85
     86#define RESTORE_TOC(name)	\
     87	/* Restore our TOC pointer using our entry point */	\
     88	LOAD_REG_IMMEDIATE(r12, name)				\
     890:	addis	r2,r12,(.TOC.-0b)@ha;				\
     90	addi	r2,r2,(.TOC.-0b)@l;
     91
     92#else
     93#define ENTRY_POINT(name) FUNC_START(name)
     94#define RESTORE_TOC(name)	\
     95	/* Restore our TOC pointer via our opd entry */	\
     96	LOAD_REG_IMMEDIATE(r2, name)			\
     97	ld      r2,8(r2);
     98#endif
     99
    100    .text
    101
    102ENTRY_POINT(ebb_handler)
    103    stdu    r1,-STACK_FRAME(r1)
    104    SAVE_GPR(0)
    105    mflr    r0
    106    std     r0,LR_SAVE(r1)
    107    mfcr    r0
    108    std     r0,CCR_SAVE(r1)
    109    mfctr   r0
    110    std     r0,CTR_SAVE(r1)
    111    mfxer   r0
    112    std     r0,XER_SAVE(r1)
    113    SAVE_GPR(2)
    114    SAVE_GPR(3)
    115    SAVE_GPR(4)
    116    SAVE_GPR(5)
    117    SAVE_GPR(6)
    118    SAVE_GPR(7)
    119    SAVE_GPR(8)
    120    SAVE_GPR(9)
    121    SAVE_GPR(10)
    122    SAVE_GPR(11)
    123    SAVE_GPR(12)
    124    SAVE_GPR(13)
    125    SAVE_GPR(14)
    126    SAVE_GPR(15)
    127    SAVE_GPR(16)
    128    SAVE_GPR(17)
    129    SAVE_GPR(18)
    130    SAVE_GPR(19)
    131    SAVE_GPR(20)
    132    SAVE_GPR(21)
    133    SAVE_GPR(22)
    134    SAVE_GPR(23)
    135    SAVE_GPR(24)
    136    SAVE_GPR(25)
    137    SAVE_GPR(26)
    138    SAVE_GPR(27)
    139    SAVE_GPR(28)
    140    SAVE_GPR(29)
    141    SAVE_GPR(30)
    142    SAVE_GPR(31)
    143    SAVE_VSR(0, r3)
    144    mffs     f0
    145    stfd     f0, FSCR_SAVE(r1)
    146    mfvscr   f0
    147    stfd     f0, VSCR_SAVE(r1)
    148    SAVE_VSR(1,  r3)
    149    SAVE_VSR(2,  r3)
    150    SAVE_VSR(3,  r3)
    151    SAVE_VSR(4,  r3)
    152    SAVE_VSR(5,  r3)
    153    SAVE_VSR(6,  r3)
    154    SAVE_VSR(7,  r3)
    155    SAVE_VSR(8,  r3)
    156    SAVE_VSR(9,  r3)
    157    SAVE_VSR(10, r3)
    158    SAVE_VSR(11, r3)
    159    SAVE_VSR(12, r3)
    160    SAVE_VSR(13, r3)
    161    SAVE_VSR(14, r3)
    162    SAVE_VSR(15, r3)
    163    SAVE_VSR(16, r3)
    164    SAVE_VSR(17, r3)
    165    SAVE_VSR(18, r3)
    166    SAVE_VSR(19, r3)
    167    SAVE_VSR(20, r3)
    168    SAVE_VSR(21, r3)
    169    SAVE_VSR(22, r3)
    170    SAVE_VSR(23, r3)
    171    SAVE_VSR(24, r3)
    172    SAVE_VSR(25, r3)
    173    SAVE_VSR(26, r3)
    174    SAVE_VSR(27, r3)
    175    SAVE_VSR(28, r3)
    176    SAVE_VSR(29, r3)
    177    SAVE_VSR(30, r3)
    178    SAVE_VSR(31, r3)
    179    SAVE_VSR(32, r3)
    180    SAVE_VSR(33, r3)
    181    SAVE_VSR(34, r3)
    182    SAVE_VSR(35, r3)
    183    SAVE_VSR(36, r3)
    184    SAVE_VSR(37, r3)
    185    SAVE_VSR(38, r3)
    186    SAVE_VSR(39, r3)
    187    SAVE_VSR(40, r3)
    188    SAVE_VSR(41, r3)
    189    SAVE_VSR(42, r3)
    190    SAVE_VSR(43, r3)
    191    SAVE_VSR(44, r3)
    192    SAVE_VSR(45, r3)
    193    SAVE_VSR(46, r3)
    194    SAVE_VSR(47, r3)
    195    SAVE_VSR(48, r3)
    196    SAVE_VSR(49, r3)
    197    SAVE_VSR(50, r3)
    198    SAVE_VSR(51, r3)
    199    SAVE_VSR(52, r3)
    200    SAVE_VSR(53, r3)
    201    SAVE_VSR(54, r3)
    202    SAVE_VSR(55, r3)
    203    SAVE_VSR(56, r3)
    204    SAVE_VSR(57, r3)
    205    SAVE_VSR(58, r3)
    206    SAVE_VSR(59, r3)
    207    SAVE_VSR(60, r3)
    208    SAVE_VSR(61, r3)
    209    SAVE_VSR(62, r3)
    210    SAVE_VSR(63, r3)
    211
    212    TRASH_GPR(2)
    213    TRASH_GPR(3)
    214    TRASH_GPR(4)
    215    TRASH_GPR(5)
    216    TRASH_GPR(6)
    217    TRASH_GPR(7)
    218    TRASH_GPR(8)
    219    TRASH_GPR(9)
    220    TRASH_GPR(10)
    221    TRASH_GPR(11)
    222    TRASH_GPR(12)
    223    TRASH_GPR(14)
    224    TRASH_GPR(15)
    225    TRASH_GPR(16)
    226    TRASH_GPR(17)
    227    TRASH_GPR(18)
    228    TRASH_GPR(19)
    229    TRASH_GPR(20)
    230    TRASH_GPR(21)
    231    TRASH_GPR(22)
    232    TRASH_GPR(23)
    233    TRASH_GPR(24)
    234    TRASH_GPR(25)
    235    TRASH_GPR(26)
    236    TRASH_GPR(27)
    237    TRASH_GPR(28)
    238    TRASH_GPR(29)
    239    TRASH_GPR(30)
    240    TRASH_GPR(31)
    241
    242    RESTORE_TOC(ebb_handler)
    243
    244    /*
    245     * r13 is our TLS pointer. We leave whatever value was in there when the
    246     * EBB fired. That seems to be OK because once set the TLS pointer is not
    247     * changed - but presumably that could change in future.
    248     */
    249
    250    bl      ebb_hook
    251    nop
    252
    253    /* r2 may be changed here but we don't care */
    254
    255    lfd      f0, FSCR_SAVE(r1)
    256    mtfsf    0xff,f0
    257    lfd      f0, VSCR_SAVE(r1)
    258    mtvscr   f0
    259    LOAD_VSR(0, r3)
    260    LOAD_VSR(1,  r3)
    261    LOAD_VSR(2,  r3)
    262    LOAD_VSR(3,  r3)
    263    LOAD_VSR(4,  r3)
    264    LOAD_VSR(5,  r3)
    265    LOAD_VSR(6,  r3)
    266    LOAD_VSR(7,  r3)
    267    LOAD_VSR(8,  r3)
    268    LOAD_VSR(9,  r3)
    269    LOAD_VSR(10, r3)
    270    LOAD_VSR(11, r3)
    271    LOAD_VSR(12, r3)
    272    LOAD_VSR(13, r3)
    273    LOAD_VSR(14, r3)
    274    LOAD_VSR(15, r3)
    275    LOAD_VSR(16, r3)
    276    LOAD_VSR(17, r3)
    277    LOAD_VSR(18, r3)
    278    LOAD_VSR(19, r3)
    279    LOAD_VSR(20, r3)
    280    LOAD_VSR(21, r3)
    281    LOAD_VSR(22, r3)
    282    LOAD_VSR(23, r3)
    283    LOAD_VSR(24, r3)
    284    LOAD_VSR(25, r3)
    285    LOAD_VSR(26, r3)
    286    LOAD_VSR(27, r3)
    287    LOAD_VSR(28, r3)
    288    LOAD_VSR(29, r3)
    289    LOAD_VSR(30, r3)
    290    LOAD_VSR(31, r3)
    291    LOAD_VSR(32, r3)
    292    LOAD_VSR(33, r3)
    293    LOAD_VSR(34, r3)
    294    LOAD_VSR(35, r3)
    295    LOAD_VSR(36, r3)
    296    LOAD_VSR(37, r3)
    297    LOAD_VSR(38, r3)
    298    LOAD_VSR(39, r3)
    299    LOAD_VSR(40, r3)
    300    LOAD_VSR(41, r3)
    301    LOAD_VSR(42, r3)
    302    LOAD_VSR(43, r3)
    303    LOAD_VSR(44, r3)
    304    LOAD_VSR(45, r3)
    305    LOAD_VSR(46, r3)
    306    LOAD_VSR(47, r3)
    307    LOAD_VSR(48, r3)
    308    LOAD_VSR(49, r3)
    309    LOAD_VSR(50, r3)
    310    LOAD_VSR(51, r3)
    311    LOAD_VSR(52, r3)
    312    LOAD_VSR(53, r3)
    313    LOAD_VSR(54, r3)
    314    LOAD_VSR(55, r3)
    315    LOAD_VSR(56, r3)
    316    LOAD_VSR(57, r3)
    317    LOAD_VSR(58, r3)
    318    LOAD_VSR(59, r3)
    319    LOAD_VSR(60, r3)
    320    LOAD_VSR(61, r3)
    321    LOAD_VSR(62, r3)
    322    LOAD_VSR(63, r3)
    323
    324    ld      r0,XER_SAVE(r1)
    325    mtxer   r0
    326    ld      r0,CTR_SAVE(r1)
    327    mtctr   r0
    328    ld      r0,LR_SAVE(r1)
    329    mtlr    r0
    330    ld      r0,CCR_SAVE(r1)
    331    mtcr    r0
    332    REST_GPR(0)
    333    REST_GPR(2)
    334    REST_GPR(3)
    335    REST_GPR(4)
    336    REST_GPR(5)
    337    REST_GPR(6)
    338    REST_GPR(7)
    339    REST_GPR(8)
    340    REST_GPR(9)
    341    REST_GPR(10)
    342    REST_GPR(11)
    343    REST_GPR(12)
    344    REST_GPR(13)
    345    REST_GPR(14)
    346    REST_GPR(15)
    347    REST_GPR(16)
    348    REST_GPR(17)
    349    REST_GPR(18)
    350    REST_GPR(19)
    351    REST_GPR(20)
    352    REST_GPR(21)
    353    REST_GPR(22)
    354    REST_GPR(23)
    355    REST_GPR(24)
    356    REST_GPR(25)
    357    REST_GPR(26)
    358    REST_GPR(27)
    359    REST_GPR(28)
    360    REST_GPR(29)
    361    REST_GPR(30)
    362    REST_GPR(31)
    363    addi    r1,r1,STACK_FRAME
    364    RFEBB
    365FUNC_END(ebb_handler)