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 (2877B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#include <linux/linkage.h>
      3
      4#include <asm/asm-offsets.h>
      5#include <asm/page.h>
      6#include <asm/setup.h>
      7
      8
      9#define MMU_BASE	8		/* MMU flags base in cpu_mmu_flags */
     10
     11.text
     12
     13ENTRY(relocate_new_kernel)
     14	movel %sp@(4),%a0		/* a0 = ptr */
     15	movel %sp@(8),%a1		/* a1 = start */
     16	movel %sp@(12),%d1		/* d1 = cpu_mmu_flags */
     17	movew #PAGE_MASK,%d2		/* d2 = PAGE_MASK */
     18
     19	/* Disable MMU */
     20
     21	btst #MMU_BASE + MMUB_68851,%d1
     22	jeq 3f
     23
     241:	/* 68851 or 68030 */
     25
     26	lea %pc@(.Lcopy),%a4
     272:	addl #0x00000000,%a4		/* virt_to_phys() */
     28
     29	.section ".m68k_fixup","aw"
     30	.long M68K_FIXUP_MEMOFFSET, 2b+2
     31	.previous
     32
     33	.chip 68030
     34	pmove %tc,%d0			/* Disable MMU */
     35	bclr #7,%d0
     36	pmove %d0,%tc
     37	jmp %a4@			/* Jump to physical .Lcopy */
     38	.chip 68k
     39
     403:
     41	btst #MMU_BASE + MMUB_68030,%d1
     42	jne 1b
     43
     44	btst #MMU_BASE + MMUB_68040,%d1
     45	jeq 6f
     46
     474:	/* 68040 or 68060 */
     48
     49	lea %pc@(.Lcont040),%a4
     505:	addl #0x00000000,%a4		/* virt_to_phys() */
     51
     52	.section ".m68k_fixup","aw"
     53	.long M68K_FIXUP_MEMOFFSET, 5b+2
     54	.previous
     55
     56	movel %a4,%d0
     57	andl #0xff000000,%d0
     58	orw #0xe020,%d0			/* Map 16 MiB, enable, cacheable */
     59	.chip 68040
     60	movec %d0,%itt0
     61	movec %d0,%dtt0
     62	.chip 68k
     63	jmp %a4@			/* Jump to physical .Lcont040 */
     64
     65.Lcont040:
     66	moveq #0,%d0
     67	.chip 68040
     68	movec %d0,%tc			/* Disable MMU */
     69	movec %d0,%itt0
     70	movec %d0,%itt1
     71	movec %d0,%dtt0
     72	movec %d0,%dtt1
     73	.chip 68k
     74	jra .Lcopy
     75
     766:
     77	btst #MMU_BASE + MMUB_68060,%d1
     78	jne 4b
     79
     80.Lcopy:
     81	movel %a0@+,%d0			/* d0 = entry = *ptr */
     82	jeq .Lflush
     83
     84	btst #2,%d0			/* entry & IND_DONE? */
     85	jne .Lflush
     86
     87	btst #1,%d0			/* entry & IND_INDIRECTION? */
     88	jeq 1f
     89	andw %d2,%d0
     90	movel %d0,%a0			/* ptr = entry & PAGE_MASK */
     91	jra .Lcopy
     92
     931:
     94	btst #0,%d0			/* entry & IND_DESTINATION? */
     95	jeq 2f
     96	andw %d2,%d0
     97	movel %d0,%a2			/* a2 = dst = entry & PAGE_MASK */
     98	jra .Lcopy
     99
    1002:
    101	btst #3,%d0			/* entry & IND_SOURCE? */
    102	jeq .Lcopy
    103
    104	andw %d2,%d0
    105	movel %d0,%a3			/* a3 = src = entry & PAGE_MASK */
    106	movew #PAGE_SIZE/32 - 1,%d0	/* d0 = PAGE_SIZE/32 - 1 */
    1073:
    108	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    109	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    110	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    111	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    112	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    113	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    114	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    115	movel %a3@+,%a2@+		/* *dst++ = *src++ */
    116	dbf %d0, 3b
    117	jra .Lcopy
    118
    119.Lflush:
    120	/* Flush all caches */
    121
    122	btst #CPUB_68020,%d1
    123	jeq 2f
    124
    1251:	/* 68020 or 68030 */
    126	.chip 68030
    127	movec %cacr,%d0
    128	orw #0x808,%d0
    129	movec %d0,%cacr
    130	.chip 68k
    131	jra .Lreincarnate
    132
    1332:
    134	btst #CPUB_68030,%d1
    135	jne 1b
    136
    137	btst #CPUB_68040,%d1
    138	jeq 4f
    139
    1403:	/* 68040 or 68060 */
    141	.chip 68040
    142	nop
    143	cpusha %bc
    144	nop
    145	cinva %bc
    146	nop
    147	.chip 68k
    148	jra .Lreincarnate
    149
    1504:
    151	btst #CPUB_68060,%d1
    152	jne 3b
    153
    154.Lreincarnate:
    155	jmp %a1@
    156
    157relocate_new_kernel_end:
    158
    159ENTRY(relocate_new_kernel_size)
    160	.long relocate_new_kernel_end - relocate_new_kernel