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 13 ENTRY(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 24 1: /* 68851 or 68030 */ 25 26 lea %pc@(.Lcopy),%a4 27 2: 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 40 3: 41 btst #MMU_BASE + MMUB_68030,%d1 42 jne 1b 43 44 btst #MMU_BASE + MMUB_68040,%d1 45 jeq 6f 46 47 4: /* 68040 or 68060 */ 48 49 lea %pc@(.Lcont040),%a4 50 5: 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 76 6: 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 93 1: 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 100 2: 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 */ 107 3: 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 125 1: /* 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 133 2: 134 btst #CPUB_68030,%d1 135 jne 1b 136 137 btst #CPUB_68040,%d1 138 jeq 4f 139 140 3: /* 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 150 4: 151 btst #CPUB_68060,%d1 152 jne 3b 153 154 .Lreincarnate: 155 jmp %a1@ 156 157 relocate_new_kernel_end: 158 159 ENTRY(relocate_new_kernel_size) 160 .long relocate_new_kernel_end - relocate_new_kernel
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.