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