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

subcore-asm.S (1806B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Copyright 2013, Michael (Ellerman|Neuling), IBM Corporation.
      4 */
      5
      6#include <asm/asm-offsets.h>
      7#include <asm/ppc_asm.h>
      8#include <asm/reg.h>
      9
     10#include "subcore.h"
     11
     12
     13_GLOBAL(split_core_secondary_loop)
     14	/*
     15	 * r3 = u8 *state, used throughout the routine
     16	 * r4 = temp
     17	 * r5 = temp
     18	 * ..
     19	 * r12 = MSR
     20	 */
     21	mfmsr	r12
     22
     23	/* Disable interrupts so SRR0/1 don't get trashed */
     24	li	r4,0
     25	ori	r4,r4,MSR_EE|MSR_SE|MSR_BE|MSR_RI
     26	andc	r4,r12,r4
     27	sync
     28	mtmsrd	r4
     29
     30	/* Switch to real mode and leave interrupts off */
     31	li	r5, MSR_IR|MSR_DR
     32	andc	r5, r4, r5
     33
     34	LOAD_REG_ADDR(r4, real_mode)
     35
     36	mtspr	SPRN_SRR0,r4
     37	mtspr	SPRN_SRR1,r5
     38	rfid
     39	b	.	/* prevent speculative execution */
     40
     41real_mode:
     42	/* Grab values from unsplit SPRs */
     43	mfspr	r6,  SPRN_LDBAR
     44	mfspr	r7,  SPRN_PMMAR
     45	mfspr	r8,  SPRN_PMCR
     46	mfspr	r9,  SPRN_RPR
     47	mfspr	r10, SPRN_SDR1
     48
     49	/* Order reading the SPRs vs telling the primary we are ready to split */
     50	sync
     51
     52	/* Tell thread 0 we are in real mode */
     53	li	r4, SYNC_STEP_REAL_MODE
     54	stb	r4, 0(r3)
     55
     56	li	r5, (HID0_POWER8_4LPARMODE | HID0_POWER8_2LPARMODE)@highest
     57	sldi	r5, r5, 48
     58
     59	/* Loop until we see the split happen in HID0 */
     601:	mfspr	r4, SPRN_HID0
     61	and.	r4, r4, r5
     62	beq	1b
     63
     64	/*
     65	 * We only need to initialise the below regs once for each subcore,
     66	 * but it's simpler and harmless to do it on each thread.
     67	 */
     68
     69	/* Make sure various SPRS have sane values */
     70	li	r4, 0
     71	mtspr	SPRN_LPID, r4
     72	mtspr	SPRN_PCR, r4
     73	mtspr	SPRN_HDEC, r4
     74
     75	/* Restore SPR values now we are split */
     76	mtspr	SPRN_LDBAR, r6
     77	mtspr	SPRN_PMMAR, r7
     78	mtspr	SPRN_PMCR, r8
     79	mtspr	SPRN_RPR, r9
     80	mtspr	SPRN_SDR1, r10
     81
     82	LOAD_REG_ADDR(r5, virtual_mode)
     83
     84	/* Get out of real mode */
     85	mtspr	SPRN_SRR0,r5
     86	mtspr	SPRN_SRR1,r12
     87	rfid
     88	b	.	/* prevent speculative execution */
     89
     90virtual_mode:
     91	blr