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

relocate_kernel.S (2874B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#include <linux/linkage.h>
      3#include <linux/kexec.h>
      4
      5#include <asm/assembly.h>
      6#include <asm/asm-offsets.h>
      7#include <asm/page.h>
      8#include <asm/setup.h>
      9#include <asm/psw.h>
     10
     11.level PA_ASM_LEVEL
     12
     13.macro	kexec_param name
     14.align 8
     15ENTRY(kexec\()_\name)
     16#ifdef CONFIG_64BIT
     17	.dword 0
     18#else
     19	.word 0
     20#endif
     21
     22ENTRY(kexec\()_\name\()_offset)
     23	.word kexec\()_\name - relocate_new_kernel
     24.endm
     25
     26.text
     27
     28/* args:
     29 * r26 - kimage->head
     30 * r25 - start address of kernel
     31 * r24 - physical address of relocate code
     32 */
     33
     34ENTRY_CFI(relocate_new_kernel)
     350:	copy	%arg1, %rp
     36	/* disable I and Q bit, so we are allowed to execute RFI */
     37	rsm PSW_SM_I, %r0
     38	nop
     39	nop
     40	nop
     41	nop
     42	nop
     43	nop
     44	nop
     45
     46	rsm PSW_SM_Q, %r0
     47	nop
     48	nop
     49	nop
     50	nop
     51	nop
     52	nop
     53	nop
     54
     55	/*
     56	 * After return-from-interrupt, we want to run without Code/Data
     57	 * translation enabled just like on a normal boot.
     58	 */
     59
     60	/* calculate new physical execution address */
     61	ldo	1f-0b(%arg2), %r1
     62	mtctl	%r0, %cr17 /* IIASQ */
     63	mtctl	%r0, %cr17 /* IIASQ */
     64	mtctl	%r1, %cr18 /* IIAOQ */
     65	ldo	4(%r1),%r1
     66	mtctl	%r1, %cr18 /* IIAOQ */
     67#ifdef CONFIG_64BIT
     68	depdi,z	1, PSW_W_BIT, 1, %r1
     69	mtctl	%r1, %cr22 /* IPSW */
     70#else
     71	mtctl	%r0, %cr22 /* IPSW */
     72#endif
     73	/* lets go... */
     74	rfi
     751:	nop
     76	nop
     77
     78.Lloop:
     79	LDREG,ma	REG_SZ(%arg0), %r3
     80	/* If crash kernel, no copy needed */
     81	cmpib,COND(=),n 0,%r3,boot
     82
     83	bb,<,n		%r3, 31 - IND_DONE_BIT, boot
     84	bb,>=,n		%r3, 31 - IND_INDIRECTION_BIT, .Lnotind
     85	/* indirection, load and restart */
     86	movb		%r3, %arg0, .Lloop
     87	depi		0, 31, PAGE_SHIFT, %arg0
     88
     89.Lnotind:
     90	bb,>=,n		%r3, 31 - IND_DESTINATION_BIT, .Lnotdest
     91	b		.Lloop
     92	copy		%r3, %r20
     93
     94.Lnotdest:
     95	bb,>=		%r3, 31 - IND_SOURCE_BIT, .Lloop
     96	depi		0, 31, PAGE_SHIFT, %r3
     97	copy		%r3, %r21
     98
     99	/* copy page */
    100	copy		%r0, %r18
    101	zdepi		1, 31 - PAGE_SHIFT, 1, %r18
    102	add		%r20, %r18, %r17
    103
    104	depi		0, 31, PAGE_SHIFT, %r20
    105.Lcopy:
    106	copy		%r20, %r12
    107	LDREG,ma	REG_SZ(%r21), %r8
    108	LDREG,ma	REG_SZ(%r21), %r9
    109	LDREG,ma	REG_SZ(%r21), %r10
    110	LDREG,ma	REG_SZ(%r21), %r11
    111	STREG,ma	%r8, REG_SZ(%r20)
    112	STREG,ma	%r9, REG_SZ(%r20)
    113	STREG,ma	%r10, REG_SZ(%r20)
    114	STREG,ma	%r11, REG_SZ(%r20)
    115
    116#ifndef CONFIG_64BIT
    117	LDREG,ma	REG_SZ(%r21), %r8
    118	LDREG,ma	REG_SZ(%r21), %r9
    119	LDREG,ma	REG_SZ(%r21), %r10
    120	LDREG,ma	REG_SZ(%r21), %r11
    121	STREG,ma	%r8, REG_SZ(%r20)
    122	STREG,ma	%r9, REG_SZ(%r20)
    123	STREG,ma	%r10, REG_SZ(%r20)
    124	STREG,ma	%r11, REG_SZ(%r20)
    125#endif
    126
    127	fdc		%r0(%r12)
    128	cmpb,COND(<<)	%r20,%r17,.Lcopy
    129	fic		(%sr4, %r12)
    130	b,n		.Lloop
    131
    132boot:
    133	mtctl	%r0, %cr15
    134
    135	LDREG	kexec_free_mem-0b(%arg2), %arg0
    136	LDREG	kexec_cmdline-0b(%arg2), %arg1
    137	LDREG	kexec_initrd_end-0b(%arg2), %arg3
    138	LDREG	kexec_initrd_start-0b(%arg2), %arg2
    139	bv,n %r0(%rp)
    140
    141ENDPROC_CFI(relocate_new_kernel);
    142
    143ENTRY(relocate_new_kernel_size)
    144       .word relocate_new_kernel_size - relocate_new_kernel
    145
    146kexec_param cmdline
    147kexec_param initrd_start
    148kexec_param initrd_end
    149kexec_param free_mem